9

Ho un RecyclerView implementato utilizzando GridLayoutManager.Centrare gli elementi in un RecyclerView quando è implementato con GridLayoutManager

A seconda del numero di elementi nel set di dati, lo spanCount è compreso tra 1 e 4. Le larghezze dell'oggetto cambiano in base allo spanCount. Se lo spancount è 4 o superiore, lo spanCount viene lasciato su 4.

Se ho 5 elementi, rimane 1 oggetto rimasto (4 elementi in 1 riga, 1 elemento rimasto), posizionato a sinistra del schermo, in fila da solo. Mi piacerebbe che fosse centrato.

Ho provato a impostare in modo programmatico il margine sinistro dell'elemento, avvolgendo sia il recyclerView che i singoli elementi in LinearLayouts e impostando la gravità al centro, nonché impostando la gravità del recyclerView.

Esempio elemento XML:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="horizontal" 

    > 


    <RelativeLayout 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:layout_gravity="center" 
     android:id="@+id/relative" 
     /> 

</LinearLayout> 

Esempio RecyclerView XML

 <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center" 
      android:orientation="horizontal" 
      > 
      <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycler" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 

      /> 

     </LinearLayout> 

Qualcuno può suggerire una soluzione o, darmi il materiale su cui lavorare.

Grazie in anticipo.

risposta

9

La risposta a questo è che, quando si imposta lo spancount del GridLayoutManager, ogni elemento, non importa quanto grande si tenta e farlo, non si espanderà di dimensioni oltre le dimensioni consentite per il singolo elemento. Questa dimensione consentita 'caselle' nell'elemento, e la dimensione della scatola è specificato dall'altezza totale e dalla larghezza del recyclerview in relazione allo spancount impostato su GridLayoutManager. Questo significa anche che non puoi usare le impostazioni di gravità per spingere un oggetto fuori dalla sua "scatola".

La casella/cella dell'articolo è generalmente calcolata in questo modo: se la larghezza del riclassamento è 100dp e lo spancount è 2, ogni casella/cella di elementi avrà una larghezza di: width/spanCount. In questo caso, ciascuna casella avrà una larghezza di 50dp (100dp/spanCountOf2).

Per fare in modo che un oggetto occupi tutto il 100dp e sia centrato nello spazio di 100dp, l'oggetto dovrà occupare 2 spancount, cioè se la larghezza è 100dp e lo spancount è 2, ogni elemento è assegnato a 50dp in larghezza (1 dei 2 spancount disponibili), per l'elemento che occupa l'intero 100dp, devi dire al gridLayoutManager che l'elemento in posizione X occupa 2 spanCounts invece di 1. Una volta che l'oggetto riprende a larghezza intera, o alla quantità di span che si desidera occupare, può essere centrata o ridimensionata all'interno della casella appena definita (la dimensione della casella è la larghezza/altezza del riciclatore in relazione al suo spancount).

Per modificare il numero di span di un dato elemento, chiamare: setSpanSizeLookup() sul GridLayoutManager. Quindi identificare la posizione della voce che si desidera modificare lo spanSize della e nella dichiarazione di ritorno del metodo setSpanSizeLookup(), restituire il numero di campate che si desidera utilizzare:

gridlayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
       @Override 
       public int getSpanSize(int position) { 
        if (position == 1) { 
         return 4; // the item in position now takes up 4 spans 
        } 
        return 1; 
       } 
      }); 
     } 

Alterando la spanCount di articoli, puoi usare le impostazioni di gravità per centrare un oggetto nel mezzo di una riga, se quell'elemento occupa lo spancount totale per ogni riga.

Tuttavia, è possibile che sia necessario utilizzare anche layout alternativi nell'adattatore per gli articoli per centrare gli articoli. Quindi, potenziale, potrebbe essere necessario mischiare e abbinare le impostazioni con diversi conteggi di span e utilizzando diversi layout tramite il metodo getItemViewType() in recyclerAdapter.

+1

Ben spiegato! – NightFury

Problemi correlati