2012-09-01 11 views

Trả lời

19

Tôi phải giải quyết đêm qua và nó đã hiệu quả với tôi. Nó trông lên chiều rộng của một đứa trẻ và giả sử tất cả các ô có cùng chiều rộng, chia chiều rộng của GridView theo chiều rộng của trẻ. (getColumnWidth() cũng không khả dụng trong các API trước đó, do đó, do đó giải pháp thay thế).

private int getNumColumnsCompat() { 
    if (Build.VERSION.SDK_INT >= 11) { 
     return getNumColumnsCompat11(); 

    } else { 
     int columns = 0; 
     int children = getChildCount(); 
     if (children > 0) { 
      int width = getChildAt(0).getMeasuredWidth(); 
      if (width > 0) { 
       columns = getWidth()/width; 
      } 
     } 
     return columns > 0 ? columns : AUTO_FIT; 
    } 
} 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
private int getNumColumnsCompat11() { 
    return getNumColumns(); 
} 

Tuy nhiên, có một số hạn chế quan trọng cần lưu ý với điều này.

  • Nó sẽ chỉ hoạt động sau khi GridView được đặt ra và chỉ khi thực sự có một số chế độ xem được thêm vào đó.
  • Điều này không tính đến bất kỳ khoảng cách ô nào được thêm với setHorizontalSpacing(). Nếu bạn sử dụng khoảng cách ngang, bạn có thể cần phải tinh chỉnh điều này để tính đến nó.
  • Trong trường hợp của tôi, tôi không có bất kỳ paddings hoặc chiều rộng bổ sung để chiếm. Nếu bạn làm thế, bạn sẽ cần phải tinh chỉnh điều này để đảm bảo sự phân chia kết thúc với câu trả lời đúng.
1

Nếu bạn có một cái nhìn tại trang GridView từ Android Hướng dẫn API, bạn sẽ thấy có một phương pháp gọi là onItemClickListener, nơi một trong những thông số là vị trí này. Cùng với getNumColumns() có thể bạn có thể nhận được số hàng.

+0

Cảm ơn. getNumColumns() không có sẵn cho API Cấp 8 – Hong

3

thử điều này:

Math.ceil((double)gridView.getCount()/(double)gridView.getNumColumns()); 
+2

Có thể muốn getNumColumn thay vì getColumnWidth. – Joey

+0

oops..đã được khắc phục ngay bây giờ, cảm ơn –

+0

Cảm ơn bạn đã cố giúp đỡ. Thật không may, getNumColumns() là dành cho API cấp 11 hoặc cao hơn. – Hong

4

tôi giải quyết sự thiếu getNumColumns trong động cơ V8, trong trường hợp số cột được chỉ rõ trong tài nguyên, bằng cách tuyên bố một tài nguyên số nguyên và sử dụng rằng trong nguồn GridView và mã .

<integer name="num_grid_columns">2</integer> 

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="vertical" 
    app:columnCount="@integer/num_grid_columns" 
    app:orientation="horizontal" > 

int cols = getResources().getInteger(R.integer.num_grid_columns); 
2

Thêm câu trả lời trùng lặp ở đây vì ban đầu tôi đã trả lời duplicate question.

Tôi đã thêm triển khai này vào lớp con GridView tùy chỉnh của tôi và nó hoạt động như mong đợi. Tôi đã kiểm tra các trường đã khai báo của lớp GridView và ít nhất là trên API 8, chúng đã có một trường có tên là mNumColumns (đó là những gì được trả lại trên API 18 bởi getNumColumns()). Họ có lẽ đã không thay đổi tên trường thành cái gì khác và sau đó trở lại giữa các API 8 và 18, nhưng tôi đã không kiểm tra.

@Override 
public int getNumColumns() { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     return super.getNumColumns(); 
    } else { 
     try { 
      Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns"); 
      numColumns.setAccessible(true); 
      return numColumns.getInt(this); 
     } catch (Exception e) { 
      return 1; 
     } 
    } 
} 

@Override sẽ không gây ra bất kỳ lỗi nào vì nó chỉ là chú thích kiểm tra an toàn AFAIK.

Tôi cũng không biết liệu có bất kỳ đề xuất phản đối nào để làm như thế này thay vì có phương thức getNumColumnsCompat() riêng biệt (như trên @cottonBallPaws câu trả lời), nhưng tôi thấy nó khá gọn gàng như thế này.

+0

Cảm ơn, It's workd for me. – tungdx