2012-09-01 25 views

Respuesta

19

Tuve que resolver esta última noche y funcionó para mí. Busca el ancho de un niño y, suponiendo que todas las celdas tengan el mismo ancho, divide el ancho de GridView por el ancho del niño. (getColumnWidth() tampoco está disponible en las API anteriores, por lo tanto, la solución alternativa).

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

Sin embargo, hay algunas restricciones importantes a tener en cuenta con esto.

  • Funcionará solo después de que se haya diseñado GridView y solo cuando en realidad tenga algunas vistas agregadas.
  • Esto no tiene en cuenta ningún espacio entre celdas agregado con setHorizontalSpacing(). Si utiliza el espaciado horizontal, es posible que deba ajustarlo para dar cuenta de ello.
  • En mi caso, no tenía ningún relleno o ancho adicional para tener en cuenta. Si lo hace, tendrá que ajustar esto para asegurarse de que la división termine con la respuesta correcta.
1

Si se echa un vistazo a la página GridView desde el Android Guía API, verá que no es un método llamado onItemClickListener, donde uno de los parámetros es la posición. Junto con getNumColumns() tal vez pueda obtener el número de filas.

+0

Gracias. getNumColumns() no está disponible para API Level 8 – Hong

3

intente esto:

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

Probablemente quiera getNumColumns en lugar de getColumnWidth. – Joey

+0

oops..fixed now, thanks –

+0

Gracias por intentar ayudar. Lamentablemente, getNumColumns() es para API nivel 11 o superior. – Hong

4

He resuelto la falta de getNumColumns en V8, en el caso en el que se especifica el número de columnas en el recurso, declarando un entero de recurso y el uso que en el recurso de GridView y el código .

<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

Agregando aquí la respuesta duplicada ya que inicialmente respondí duplicate question.

Agregué esta implementación en una subclase personalizada de GridView, y funcionó como se esperaba. Comprobé los campos declarados de la clase GridView y al menos en la API 8 ya tienen un campo llamado mNumColumns (que es lo que se devuelve en API 18 por getNumColumns()). Probablemente no hayan cambiado el nombre del campo por otra cosa y luego hayan retrocedido entre las API 8 y 18, pero no lo he comprobado.

@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; 
     } 
    } 
} 

El @Override no causará ningún error ya que es sólo una comprobación de seguridad de anotación que yo sepa.

Tampoco sé si hay alguna contra-recomendación de hacer esto en lugar de tener un método getNumColumnsCompat() por separado (como en la respuesta de @cottonBallPaws), pero me pareció bastante claro así.

+0

Gracias, está trabajado para mí. – tungdx

Cuestiones relacionadas