9

Ich habe eine RecyclerView mit dem GridLayoutManager implementiert.Zentrieren von Elementen in einer RecyclerView, wenn es mit GridLayoutManager implementiert wird

Abhängig von der Anzahl der Elemente im Datensatz liegt der SpanCount zwischen 1-4. Die Artikelbreiten ändern sich abhängig vom spanCount. Wenn der Spancount 4 oder höher ist, bleibt der SpanCount bei 4.

Wenn ich 5 Artikel habe, bleibt 1 Artikel übrig (4 Artikel in 1 Reihe, 1 Artikel übrig), positioniert auf der linken Seite Bildschirm, in einer Reihe für sich. Ich möchte, dass es zentriert ist.

Ich habe versucht, den Rand des linken Gegenstands programmatisch zu setzen und sowohl die RecyclerView und einzelne Elemente in LinearLayouts zu verpacken und die Gravitation auf die Mitte zu setzen, als auch die Gravitation der RecyclerView festzulegen.

Beispiel Artikel 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> 

Beispiel 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> 

Kann mir jemand eine Lösung oder, gib mir Material vorschlagen, um von zu arbeiten.

Vielen Dank im Voraus.

Antwort

9

Die Antwort darauf ist, dass, wenn Sie die Spannweite des GridLayoutManager festlegen, jedes Element, unabhängig davon, wie groß Sie es versuchen und ausführen, nicht größer wird als die für das einzelne Element zulässigen Dimensionen. Diese zulässige Dimension "Boxen" in dem Element und die Größe der Box wird durch die Gesamthöhe und -breite der Recyclerview in Bezug auf die im GridLayoutManager festgelegte Bereichsgrenze angegeben. Das bedeutet auch, dass Sie die Schwerkrafteinstellungen nicht verwenden können, um ein Element außerhalb seiner "Box" zu platzieren.

Die Box/Zelle des Elements wird im Allgemeinen wie folgt berechnet: Wenn die Breite des recylerview 100dp ist und der spancount 2 ist, wird jede Element-Box/Zelle eine Breite haben von: width/spanCount. In diesem Fall hat jede Box eine Breite von 50dp (100dp/spanCountOf2).

Damit ein Artikel die vollen 100dp aufnehmen und dann im Bereich von 100dp zentriert werden kann, muss der Artikel 2 Spannweiten aufnehmen, dh wenn die Breite 100dp ist, und spancount ist 2, jedes Element 50dp Breite zugewiesen (1 der 2 verfügbaren Spancount), müssen Sie dem GridLayoutManager mitteilen, dass das Element an Position X 2 spanCounts anstelle von 1 belegt, sobald das Element die volle 100dp belegt die gesamte Breite oder die Anzahl der Spannweiten, die sie aufnehmen soll, kann in der neu definierten Box zentriert oder in der Größe angepasst werden (Boxgröße ist Breite/Höhe des Recyclers im Verhältnis zu seiner Spannweite).

Um die Anzahl der Abschnitte zu ändern, die ein bestimmtes Element benötigt, rufen Sie: setSpanSizeLookup() im GridLayoutManager auf. Dann identifizieren die Position des Elements Sie die spanSize von und in der Rückrechnung des setSpanSizeLookup() -Methode verändern wollen, zurückkehren, wie viele umspannt Sie es verwenden möchten:

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

Durch die spanCount der Elemente zu verändern, Sie können die Schwerkrafteinstellungen verwenden, um ein Element in der Mitte einer Zeile zu zentrieren, wenn dieses Element die gesamte Spannweite für jede Zeile einnimmt.

Möglicherweise müssen Sie jedoch alternative Layouts im Adapter verwenden, damit Ihre Objekte zentriert werden. Also, potentiell, müssen Sie möglicherweise Einstellungen zwischen verschiedenen Bereichen kombinieren und verschiedene Layouts über die Methode getItemViewType() im recyclerAdapter verwenden.

+1

Gut erklärt! – NightFury

Verwandte Themen