7

Sto cercando di centrare tutti i miei oggetti in orizzontale per ogni riga RecyclerViewarticoli centro orizzontalmente in RecyclerView (utilizzando GridLayoutManager)

ho provato molte cose: RelativeLayout come un genitore, quindi utilizzare layout_centerInParent, utilizzare l'androide di base: layout_gravity = "center", tenta di aggiungere qualche elemento dello spazio, con pesi e .... in item_row.xml
ma non ho avuto successo :(

quello che ho

a busy cat

Quello che voglio

a busy cat

Nell'attività

recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); 

item_row.xml

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:card_view="http://schemas.android.com/apk/res-auto" 
android:id="@+id/cardView" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
card_view:cardCornerRadius="2dp" 
card_view:cardElevation="4dp" 
card_view:cardUseCompatPadding="true"> 

<!-- Recycler View Item Row --> 
<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 


    <ImageView 
     android:id="@+id/imgThumbnail" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:adjustViewBounds="true" 
     android:background="@android:color/black" /> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 


     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:text="item name" 
      android:id="@+id/txtName" 
      android:layout_margin="5dp" 
      android:singleLine="false" 
      android:lines="2" 
      android:gravity="center" /> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

      <TextView 
       android:layout_width="0dp" 
       android:layout_height="match_parent" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:id="@+id/txtCategory" 
       android:textStyle="italic" 
       android:textColor="#496fa9" 
       android:text="subtitle" 
       android:layout_weight="1" 
       android:gravity="center_vertical" 
       android:paddingLeft="10dp" 
       android:layout_gravity="center" /> 

      <ImageButton 
       android:id="@+id/imageButton" 
       android:layout_width="48dp" 
       android:layout_height="wrap_content" 
       android:background="@android:color/black" 
       android:adjustViewBounds="true" 
       android:scaleType="fitCenter" 
       android:padding="8dp"/> 

     </LinearLayout> 

    </LinearLayout> 

</LinearLayout> 

</android.support.v7.widget.CardView> 

ho cercato su Google un sacco e ho trovato questo answer ma in realtà non so come creare un LinearLayout per ogni riga di elementi!

  • è la soluzione migliore?

  • qualche altra idea?

+0

Cercando di ottenere qualcosa di molto simile, sei riuscito a farlo funzionare? – hibob

+0

@hibob no, dai un'occhiata alla risposta qui sotto –

+0

@AliSherafat Hai trovato una soluzione? –

risposta

2

è possibile utilizzare SpanSizeLookup per creare viste/elementi con larghezza diversa per la vista griglia. Quindi con quello puoi fare un po 'di intelligenza con le viste vuote per adattarti di conseguenza. Potrebbe essere più complicato o più semplice a seconda di quanto sia effettivamente variabile il tuo layout.

di riferimento: https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager.SpanSizeLookup.html

per questo caso specifico si mostra sul disegno si dovrebbe fare qualcosa di simile:

GridLayoutManager lm = new GridLayoutManager(context, 6); 
lm.setSpanSizeLookup(new MySizeLookup()); 

public static class MySizeLookup extends SpanSizeLookup { 

    public int getSpanSize(int position) { 
     if(position >= 0 && position <= 2) { 
      return 2; 
     } else if (position == 3 || position == 6) { 
      return 1; 
     } else { 
      return 2; 
     } 
    } 
} 

e con questo si dovrà fare sulla scheda, la posizione 3 e 6 per essere un elemento vuoto/invisibile. Qualcosa come new View(context); solo per occupare quello spazio extra

+0

grazie per la tua risposta, ma è un po 'di confusione –

+0

Quindi ti suggerisco di leggere i documenti e fare alcuni test – Budius

+0

ho fatto un sacco di test e ho provato il tuo codice ma non ci sono riuscito e penso che dovrei controllare il righe che hanno meno di 3 elementi e inseriscono l'elemento di quella riga in un 'LinearLayout' con' android: layout_gravity = "center" 'attributo ** MA ** non so come farlo –

2

Utilizzare gridLayoutManager = new GridLayoutManager(context,6) e sostituire setSpanSizeLookup.

Esempio:

int totalSize=list.size(); 
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
        @Override 
        public int getSpanSize(int position) { 
         int span; 
         span = totalSize % 3; 
         if (totalSize < 3) { 
          return 6; 
         } else if (span == 0 || (position <= ((totalSize - 1) - span))) { 
          return 2; 
         } else if (span == 1) { 
          return 6; 
         } else { 
          return 3; 
         } 
        } 
       }); 

Ciò funzionerà se si desidera visualizzare 3 articoli di fila e rimanendo al centro della griglia.

Modificare lo span del gestore layout griglia conta di conseguenza il requisito.

+0

ciao @Rahul Devanavar, come fare questo su 4 articoli di seguito –

Problemi correlati