2015-05-02 18 views
28

Potrzebuję wyśrodkować elementy w każdym rzędzie, aby były jak w tym makiecie. Szukałem, czy istnieje układ, który działa w ten sposób bez wyglądu. elementy są wyśrodkowane w swoich wierszach.Jak wyśrodkować elementy z recyklingu?

mockup

Jak to wygląda teraz w moim kodu. enter image description here

+0

It brzmi dość podobnie do http://stackoverflow.com/questions/34206078/center-a-cardview-in-a-recyclerview-with-only-one-element –

+0

Czy problem został rozwiązany? –

+0

może zaistnieć potrzeba utworzenia niestandardowego menedżera układu, ponieważ GridLayoutManager nie pomaga w tym. Odpowiedziałem, ale nie jestem pewien, czy jest to dokładnie to, czego szukasz. – Mo1989

Odpowiedz

22

Take LinearLayout w swoim RecyclerView Układ wiersza elementu pozycji daje android:layout_gravity="center" do LinearLayout.

Dla każdego rzędu obrazów należy wykonać różne LinearLayout.

Oto przykładowy kod:

<LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:orientation="horizontal"> 

      <ImageView 
       android:id="@+id/image1" 
       android:layout_width="64dp" 
       android:layout_height="64dp" 
       android:layout_marginRight="10dp" 
       android:layout_weight="1" 
       android:src="@drawable/image1" /> 

      <ImageView 
       android:id="@+id/image2" 
       android:layout_width="64dp" 
       android:layout_height="64dp" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:layout_weight="1" 
       android:src="@drawable/image2" /> 

      <ImageView 
       android:id="@+id/image3" 
       android:layout_width="64dp" 
       android:layout_height="64dp" 
       android:layout_marginLeft="10dp" 
       android:layout_marginRight="10dp" 
       android:layout_weight="1" 
       android:src="@drawable/image3" /> 

    </LinearLayout> 
+0

Musiałem zmodyfikować RecyclerView layout_width = "wrap_content" zamiast match_parent, a także – jernkuan

+0

@jemkuan To wyłącza przewijanie, gdy użytkownik przesuwa palcem po krawędzi lub zewnętrznym obszarze rodzica, ponieważ szerokość okna RecyclerView będzie mniejsza niż szerokość rodzica. –

7

Zakładam, że używasz stylu LinearLayoutManager z efektem stylu RecyclerView. W takim przypadku użyj horizontalLinearLayout dla każdego wiersza, aby android:gravity="center" wyśrodkować jego zawartość.

+0

Właściwie używam gridlayout, ale pozwól mi spróbować. –

+2

@ cgomezmendez: Zakładam, że będzie jakiś sposób, aby to zrobić za pomocą 'GridLayoutManager', lub też za pomocą niestandardowego' RecyclerView.LayoutManager'. Nie widzę, na pierwszy rzut oka, jak to zrobić za pomocą 'GridLayoutManager'. – CommonsWare

+0

naprawiłeś problem? –

-1

umieścić swój recyclerview w Linelayout w xml. i zastosowania (zarówno recyclerview i linearlayout)

android:layout_gravity="center"

i szerokości recyclerview należy wrap_content podczas linearlayout powinien mieć math_parent i trzeba określić szerokość dla row_item

+0

to mu nie pomoże. Elementy potomne, które muszą być wyśrodkowane, znajdują się wewnątrz Gridlayout. –

3

można dodać kilka układów dynamicznie, na przykład:

  • Przedmiotem Adapter może być pozioma LinearLayout

1- stworzyć LinearLayout w kodzie java i dostosuj go (grawitacja, ...)

2- dodać niektóre ikony linearLayout

3- dodać linearLayout do adaptera

4- powtórz 1,2,3


// : declare new horizontal linearLayout 
    ImageView myIcons[nomOfIcons]; 
    // : add all icons to myIcons 
    for(int i=1; i<=nomOfIcons; i++){ 
     linearLayout.addView(myIcons[i - 1]); 
     if(i%numOfIconsInOneHorizontalLinearLayout==0) { 
      results.add(linearLayout); // add linearLayout to adapter dataSet 
      // : declare new horizontal linearLayout 
     } 
    } 
    if(n%numOfIconsInOneHorizontalLinearLayout!=0) // add last linearLayout if not added in the loop 
     results.add(linearLayout); 
    mAdapter.notifyDataSetChanged(); // update adapter 

0

Użyj gridLayoutManager = new GridLayoutManager(context,6) i zastąpić setSpanSizeLookup .

Przykład:

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

To będzie działać, jeśli chcesz wyświetlić 3 pozycji z rzędu i pozostając w środku siatki.

Zmiana zakresu zarządzania układem siatki liczy odpowiednio Twoje wymagania.

15

Producent recyclerview width do wrap_content i jego pojemnik na layout_gravity do center_horizontal

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

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recycrer_view" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:paddingLeft="16dp" 
      android:paddingRight="16dp" /> 
</LinearLayout> 
1

można użyć nowego layoutManager z google FlexLayoutManager to będzie daje dużo kontroli i elastyczności nad elementami recyclerView

Powiązane problemy