2012-09-01 17 views

risposta

19

Ho dovuto risolvere questa scorsa notte e ha funzionato per me. Cerca la larghezza di un bambino e assumendo che tutte le celle abbiano la stessa larghezza, divide la larghezza di GridView in base alla larghezza del bambino. (getColumnWidth() non è disponibile nelle API precedenti, quindi la soluzione 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(); 
} 

Tuttavia ci sono alcune restrizioni importanti da notare con questo.

  • Funzionerà solo dopo che GridView è stato impostato e solo quando in realtà sono state aggiunte alcune viste.
  • Questo non tiene conto di alcuna spaziatura cella aggiunta con setHorizontalSpacing(). Se si utilizza la spaziatura orizzontale potrebbe essere necessario modificare questo per renderlo conto.
  • Nel mio caso non avevo paddings o larghezza aggiuntiva da considerare. Se lo fai, dovrai modificarlo per assicurarti che la divisione finisca con la risposta giusta.
1

Se si dà un'occhiata alla pagina GridView dalla Guida API di Android , vedrete c'è un metodo chiamato onItemClickListener, in cui uno dei parametri è la posizione. Insieme a getNumColumns() forse puoi ottenere il numero di righe.

+0

Grazie. getNumColumns() non è disponibile per API Livello 8 – Hong

3

provare questo:

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

Probabilmente vuoi ottenereNumColonne invece di getColumnWidth. – Joey

+0

oops .. risolto ora, grazie –

+0

Grazie per aver cercato di aiutare. Sfortunatamente, getNumColumns() è per API di livello 11 o superiore. – Hong

4

ho risolto la mancanza di getNumColumns in V8, nel caso in cui viene specificato il numero di colonne di risorse, dichiarando una risorsa intero e utilizzando tale nella risorsa e codice 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

Aggiungere la risposta duplicata qui poiché inizialmente ho risposto a duplicate question.

Ho aggiunto questa implementazione su una mia sottoclasse GridView personalizzata e ha funzionato come previsto. Ho controllato i campi dichiarati della classe GridView e almeno su API 8 hanno già un campo chiamato mNumColumns (che è ciò che viene restituito su API 18 entro il getNumColumns()). Probabilmente non hanno cambiato il nome del campo in qualcos'altro e poi tornano tra le API 8 e 18, ma non l'ho verificato.

@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 non causerà alcun errore poiché è solo un'annotazione di controllo di sicurezza AFAIK.

Inoltre non so se ci sono contro-raccomandazioni di fare questo invece di avere un metodo separato getNumColumnsCompat() (come nella risposta di @cottonBallPaws), ma ho trovato che fosse abbastanza pulito come questo.

+0

Grazie, è un lavoro per me. – tungdx

Problemi correlati