2013-05-29 8 views
10

Sto riscontrando tutti i tipi di problemi con l'altezza delle righe in GridView.Set Fixed GridView Row Height

Mi piacerebbe impostare la dimensione degli elementi (altezza/larghezza) in XML e quindi avere l'autofit di GridView il maggior numero possibile senza allungamenti. Se non può adattarsi al prossimo elemento dovrebbe solo aggiungere padding attorno al numero corrente di elementi che è stato in grado di adattarsi.

Attualmente ottengo 2 colonne (che a me sembrano quasi fisse) e le righe vengono allungate. Qualcuno potrebbe aiutarmi a spiegare cosa sta succedendo e come ottenere ciò che voglio?

GridView:

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/main_grid" 
    android:numColumns="auto_fit" 
    android:gravity="center" 
    android:paddingRight="20dp" 
    android:paddingLeft="20dp" 
    android:clipToPadding="true" 
    android:fitsSystemWindows="true" 
    android:stretchMode="none" 
    android:background="@drawable/main_grid_background"> 

</GridView> 

GridItem (lo voglio 320x320 come ho poi inserire un'immagine di sfondo in esso che sembra strano se non è un quadrato perfetto).

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="320dp" 
    android:layout_height="320dp" 
    android:padding="10dp" > 

    <TextView 
     android:id="@+id/grid_item_label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:singleLine="true" 
     android:text="@+id/label" 
     android:layout_marginTop="5dp" 
     android:textColor="@color/black" 
     android:textSize="15sp" 
     android:visibility="invisible" 
     android:layout_centerInParent="true" > 
    </TextView> 

</RelativeLayout> 

Java:

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

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View gridView; 

     if (convertView == null) { 

      gridView = new View(context); 

      // get layout from mobile.xml 
      gridView = inflater.inflate(R.layout.main_grid_item, null); 

     } else { 
      gridView = (View) convertView; 
     } 
     TextView textView = (TextView) gridView 
       .findViewById(R.id.grid_item_label); 

      //SET TEXT AND BACKGROUND IMAGE HERE 
      //gridView.setBackgroundResource(R.drawable.main_grid_item_import); 



     return gridView; 
    } 
+0

, se possibile, si prega di inviare lo screenshot di righe tese –

+0

@MehulJoisar prega di fare riferimento alle immagini per i dettagli. – AlexIIP

+0

'android: stretchMode =" spacingWidthUniform "' non è quello che volevi? –

risposta

1

Quindi, questa non è una risposta perfetta, ma questo è come ho ottenuto a farlo funzionare. Le idee prese in prestito dal thread this.

Tutto questo presuppone che io conosca le dimensioni dell'immagine, che sono 320x320. Inoltre, in GridView ho dovuto impostare android:columnWidth="320dp" o non avrebbe funzionato. Se qualcuno ha un'idea migliore per favore pubblicala ... per ora mi sto muovendo.

XML

griglia dell'oggetto:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dp" > 
    <ImageView 
    android:id="@+id/grid_item_image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true"/> 
    <TextView 
     android:id="@+id/grid_item_label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:singleLine="true" 
     android:text="@+id/label" 
     android:textColor="@color/black" 
     android:layout_alignLeft="@+id/grid_item_image" 
     android:layout_alignTop="@+id/grid_item_image" 
     android:layout_alignRight="@+id/grid_item_image" 
     android:layout_alignBottom="@+id/grid_item_image" 
     android:gravity="center" 
     android:textSize="15sp" 
     android:visibility="invisible"> 
    </TextView> 

</RelativeLayout> 

XML GridView:

<GridView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/main_grid" 
    android:numColumns="auto_fit" 
    android:gravity="center" 
    android:columnWidth="320dp" 
    android:paddingRight="20dp" 
    android:paddingLeft="20dp" 
    android:clipToPadding="true" 
    android:fitsSystemWindows="true" 
    android:stretchMode="columnWidth" 
    android:background="@drawable/main_grid_background"> 
</GridView> 
42

Nel CustomAdapter

v.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, rowHigh)); 

rowHigh è la dimensione è necessario modificare

+1

Grazie per questo. A seconda dell'applicazione, potresti chiamare questo all'interno di v.post (nuovo Runnable ...) dopo aver fatto v come finale o equivalente oggetto ViewHolder finale. Ho un pulsante 'Chiudi' in una cella che rimuove se stesso (list.remove (posizione)) e chiama notifyDataSetChanged(). Semplicemente setLayoutParams ha agito su di me (il tempo di rendering era incasinato) e metterlo in post ha risolto il problema. –

+1

In particolare, dovrebbe andare in getView() o newView() credo. Vedere l'esempio nella documentazione: http://developer.android.com/guide/topics/ui/layout/gridview.html#example –

4
public class MyGridView extends GridView { 
    public MyGridView(Context context) { 
     super(context); 
    } 

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

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

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int heightSpec; 

     if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) { 
      // The great Android "hackatlon", the love, the magic. 
      // The two leftmost bits in the height measure spec have 
      // a special meaning, hence we can't use them to describe height. 
      heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST); 
     } else { 
      heightSpec = heightMeasureSpec; 
     } 

     super.onMeasure(widthMeasureSpec, heightSpec); 
    } 


} 

In XML:

<MyGridView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/main_grid" 
    android:gravity="center"/> 
+0

Tratto da http://www.jayway.com/2012/10/04/how-to -fare-the-altezza-of-a-gridview-wrap-suo-content / –