2012-09-01 5 views

답변

19

나는이 어젯밤을 해결해야했고 그것은 나를 위해 일했습니다. 아이의 폭을 검색해, 모든 셀이 같은 폭을 가지면 (자), GridView의 폭을 아이의 폭으로 나눕니다. (getColumnWidth()도 이전 API에서는 사용할 수 없으므로 해결 방법이 있습니다.)

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(); 
} 

그러나 여기에는 몇 가지 중요한 제한 사항이 있습니다.

  • GridView가 배치 된 후 실제로보기가 추가 된 경우에만 작동합니다.
  • 여기에는 setHorizontalSpacing()으로 추가 된 셀 간격이 고려되지 않습니다. 수평 간격을 사용하는 경우이를 고려하여이 간격을 조정해야 할 수도 있습니다.
  • 필자의 경우에는 패딩이나 추가 너비를 고려하지 않았습니다. 그렇게한다면 분열이 옳은 답으로 끝나기 위해서는이 부분을 조정해야합니다.
1

당신은 안드로이드 API 가이드에서 GridView 페이지를 보는 경우에, 당신은 매개 변수 중 하나가 위치입니다 onItemClickListener라는 방법이있다 볼 수 있습니다. getNumColumns()과 함께 행 수를 얻을 수 있습니다.

+0

감사합니다. getNumColumns()를 API 레벨 8에 사용할 수 없습니다. – Hong

3

이 시도 :

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

아마도 getColumnWidth 대신 getNumColumns를 원할 것입니다. – Joey

+0

죄송합니다. 수정되었습니다. 감사합니다. –

+0

도움을 주셔서 감사합니다. 불행히도 getNumColumns()는 API 레벨 11 이상입니다. – Hong

4

나는 열 수는 정수 자원을 선언하고 사용하여, 자원에 지정된 경우, V8에서 getNumColumns의 부족을 해결 그의 GridView 자원 및 코드 .

<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

처음에는 duplicate question으로 대답했기 때문에 여기에 중복 답변을 추가하십시오.

이 구현을 내 Custom GridView 하위 클래스에 추가했으며 예상대로 작동했습니다. GridView 클래스의 선언 된 필드를 확인하고 최소한 API 8에서는 이미 mNumColumns (API 18에서 반환되는 것은 getNumColumns())이라는 필드가 있습니다. 그들은 아마도 필드 이름을 다른 것으로 변경 한 다음 API 8과 18 사이로 돌아 가지 않았지만 아직 확인하지 않았습니다.

@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는 안전 점검 주석 AFAIK이므로 오류가 발생하지 않습니다.

별도의 getNumColumnsCompat() 메서드 (@cottonBallPaws 응답과 같은) 대신에 이렇게하는 카운터 권장 사항이 있는지는 알 수 없지만이 방법은 매우 정교합니다.

+0

감사합니다. 그것은 나를 위해 workd입니다. – tungdx

관련 문제