9

Mam RecyclerView wewnątrz HorizontalScrollView i chcę go używać GridLayoutManager. To jest ok, ale jedno mi jeszcze przeszkadza, szerokość każdej kolumny jest taka sama (na podstawie największej szerokości komórki, jaką przypuszczam?). Czy nie jest możliwe zawijanie szerokości kolumn do największej komórki tej konkretnej kolumny?GridLayoutManager - szerokość kolumny owinąć własne największe dziecko

Należy patrzeć na coś takiego:

enter image description here

gdzie część Orange jest częścią autorstwa widzenia komórki.


EDIT

Poprosiliśmy mi wyjaśnić, co się spodziewać. Przykład jest lepszy niż słowa, tutaj możesz zobaczyć zrzut ekranu z RecyclerView z GridLayoutManager. Każda pozycja jest prostym tekstem zawierającym losowo tekst pomiędzy 10 & 40 znaków. Widok RecyclerView znajduje się wewnątrz HorizontalScrollView, jak wspomniano wcześniej. Widzimy, że każda kolumna ma taką samą szerokość, mimo że żadne elementy w tej kolumnie nie mogą wypełniać całej szerokości. Chciałbym usunąć bezużyteczne puste miejsce i kolumny o różnych rozmiarach, z każdą kolumną odpowiadającą szerokości jej największego dziecka.

enter image description here

Jeśli chcesz przetestować ten problem, można sklonować ten repo wysłał na Github: https://github.com/ShargotthDev/TestGrid

Gdy zapytałem, tu jest mój układ XML (bardzo podstawowy):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <HorizontalScrollView 
     android:id="@+id/gameplay_hotizontalScroll_ScrollView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginTop="70dp"> 

     <android.support.v7.widget.RecyclerView 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:id="@+id/recycler_view" /> 

    </HorizontalScrollView> 

</RelativeLayout> 

EDIT 2

Powinienem wspomnieć, że niektóre komórki mogą mieć rozmiar zakresu> 1, a LayoutManager powinien być pionowy, aby te komórki zajmowały więcej miejsc w poziomie, a nie w pionie (nie wiem, czy robię się zrozumiałym).

Dziękujemy za poświęcony czas!

+0

Nadal nie rozumiem, czego dokładnie chcesz? –

+0

Czy możesz umieścić swój układ xml? Czy użyłeś 'columnSpan' i' columnWeight'? –

+0

@aratikyada Dodałem więcej wyjaśnień i repozytorium, które można klonować, aby odtworzyć to zachowanie i być może lepiej zrozumieć o co mi chodzi. – MHogge

Odpowiedz

6

Nie musisz umieszczać swojego RecyclerView w HorizontalScrollView. Zobacz poniższy kod.

public class MainActivity extends AppCompatActivity { 

    String[] list = new String[]{"Some text goes here", "Some small", "text", "goes here", "Some", "very large text", "goes here", 
      "Some text goes here", "Some small", "text", "goes here", "Some", "very large text", "goes here"}; 
    RecyclerView grid; 
    GridAdapter adapter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     grid = (RecyclerView)findViewById(R.id.grid); 
     grid.setLayoutManager(new GridLayoutManager(this, 2, LinearLayoutManager.HORIZONTAL, false)); 
     grid.setHasFixedSize(true); 
     adapter = new GridAdapter(list); 
     grid.setAdapter(adapter); 
    } 
} 

klasa Adapter

public class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder>{ 
    String[] mList; 
    public GridAdapter(String[] list) { 
     mList = list; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.bind(mList[position]); 
    } 

    @Override 
    public int getItemCount() { 
     return mList.length; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     TextView textView; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      textView = (TextView)itemView.findViewById(R.id.text); 
     } 

     public void bind(String s) { 
      textView.setText(s); 
     } 
    } 
} 

row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:padding="10dp"> 
    <TextView android:id="@+id/text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="cab.suresh.gridlayoutexample.MainActivity"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/grid" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 
</RelativeLayout> 

Edit Skieruj RecyclerView wewnątrz NestedScrollView jak ten

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="none"> 
    <android.support.v7.widget.RecyclerView 
     android:id="@+id/grid" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
</android.support.v4.widget.NestedScrollView> 

i ustawić liczbę spanCount tak

spanCount = 8;

grid.setLayoutManager(new GridLayoutManager(this, spanCount, LinearLayoutManager.HORIZONTAL, false)); 
+0

Zaakceptuj tę odpowiedź, jeśli rozwiąże to Twój problem. –

+0

To jest naprawdę miłe i rzeczywiście odpowiada na pytanie. Ale powinienem być bardziej precyzyjny, tabela 2D, którą generuję za pomocą tej kombinacji RecyclerView/ScrollView, może mieć komórki z spanSize> 1, ale ponieważ twoje rozwiązanie musi mieć ustawiony poziomo LayoutManager, komórka z spanSize> 1 nie ma wyglądają tak, jak wyglądają z pionowym układem LayoutManager. (Plus fakt, że będę musiał zreorganizować sposób, w jaki mój zestaw danych zostanie utworzony, ale nie jest to niemożliwe). PS: Nie wrócę bez akceptacji odpowiedzi, jeśli to naprawdę rozwiąże mój problem, nie martw się. – MHogge

+0

A jeśli nie znajdę żadnego rozwiązania, przyjmuję twoje, ponieważ rozwiązuje początkowo opisany problem. – MHogge