2013-10-31 20 views
6

Tôi có một GridView tùy chỉnh với các mặt hàng như thếGridView với mục vuông trong Android với chiều rộng adaptive/chiều cao

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clickable="false" 
android:focusable="false" 
android:focusableInTouchMode="false" 
android:gravity="center" 
android:longClickable="false" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:clickable="false" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:longClickable="false" 
    android:text="0" 
    android:textSize="60sp" /> 

</LinearLayout> 

Tôi muốn mục của tôi để có hình vuông và tôi muốn GridView để căng rộng để điền vào tất cả mọi chiều rộng của màn hình theo hướng dọc và tất cả chiều cao theo hướng ngang. Nó sẽ giống như thế này layout

Trường hợp A - là cạnh của hình vuông và B là chiều rộng lề (có thể bằng không). Tôi nghĩ rằng có lẽ tôi nên ghi đè lên phương pháp onMeasure, nhưng chính xác thì tôi nên làm gì? Có thể ai cũng có thể giúp bạn?

EDIT OK, tôi đã cố gắng đặt chiều rộng và chiều cao của các mục theo cách thủ công trong phương thức getView của bộ điều hợp, tốt hơn nhưng vẫn không phải là thứ tôi muốn. Làm thế nào tôi có thể loại bỏ khoảng cách giữa các cột?

enter image description here

+1

Kiểm tra câu trả lời của tôi về Cách quản lý GridView http://stackoverflow.com/a/13835812/833622 –

+0

Về cơ bản những gì bạn đề xuất là tính toán chiều cao và chiều rộng theo cách thủ công của một mục và sau đó chuyển giá trị này cho bộ điều hợp, phải ? Trong khi điều này có lẽ sẽ làm việc, đó là giải pháp vụng về imho. – user1685095

+0

Thực ra bạn sẽ chỉ đặt bộ điều hợp sau khi đã xem lưới. Nó giống như sử dụng GlobalLayoutListener. Một khi GridView được đo, bạn có thể tính toán tất cả mọi thứ chính xác. –

Trả lời

-1

Vì vậy, bạn cần GridView phù hợp với màn hình với cả hai stretchMode="columnWidth"stretchMode="rowWidth". Thật không may, cuối cùng không phải là thuộc tính thực sự và bạn thực sự cần phải thực hiện các phép tính này khi chạy, như Sherif elKhatib đã đề xuất.

GridView phù hợp với màn hình và trải dài cột tự động cho bạn.

<GridView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:stretchMode="columnWidth" /> 

Vì vậy, chúng tôi chỉ cần kéo dài hàng. Mà chúng ta có thể làm, bằng cách tính toán hàng rowHeight sẽ như thế nào nếu chúng ta biết chiều cao của GridView và rowsCount.

public class YourAdapter extends BaseAdapter { 

    int rowsCount; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View itemView = convertView; 
     if (itemView == null) { 
      itemView = layoutInflater.inflate(R.layout.item_view, parent, false);    
      int height = parent.getHeight(); 
      if (height > 0) { 
       LayoutParams layoutParams = itemView.getLayoutParams(); 
       layoutParams.height = (int) (height/rowsCount); 
      } // for the 1st item parent.getHeight() is not calculated yet  
     } 
    } 
} 
+0

Không hoạt động. Trong hướng ngang, nó có tất cả chiều rộng màn hình và chỉ có 3 hàng có thể được nhìn thấy. – user1685095

+0

Có vẻ như thế này. https://dl.dropboxusercontent.com/u/28070056/Screenshot_2013-11-01-22-52-34.png Và thực hiện như bạn đề nghị nó ném ngoại lệ con trỏ null trên layoutParams. – user1685095

2

Trước tiên, bạn muốn tạo lớp Chế độ xem tùy chỉnh mà bạn có thể sử dụng thay cho LinearLayout mặc định bạn đang sử dụng. Sau đó, bạn muốn ghi đè của Xem cuộc gọi onMeasure, và buộc nó phải vuông:

public class GridViewItem extends ImageView { 

    public GridViewItem(Context context) { 
     super(context); 
    } 

    public GridViewItem(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public GridViewItem(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, widthMeasureSpec); // This is the key that will make the height equivalent to its width 
    } 
} 

Sau đó, bạn có thể thay đổi tập tin của bạn để row_grid.xml:

<path.to.item.GridViewItem xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/item_image" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="centerCrop" 
    android:src="@drawable/ic_launcher" > 
</path.to.item.GridViewItem> 

Chỉ cần chắc chắn để thay đổi "con đường. to.item "vào gói chứa lớp GridViewItem.java của bạn.

Edit:

Cũng thay đổi scaleType từ fitXY để centerCrop để hình ảnh của bạn không căng bản thân và duy trì tỉ lệ của nó. Và, miễn là nó là một hình ảnh vuông, không có gì phải được cắt, bất kể.

Các vấn đề liên quan