9

Ich habe eine RecyclerView innerhalb einer HorizontalScrollView und ich möchte es eine GridLayoutManager verwenden. Das ist ok, aber eine Sache stört mich immer noch, die Breite jeder Spalte ist die gleiche (basierend auf der größten Zellenbreite, nehme ich an?). Ist es nicht möglich, die Breite von Spalten so zu ändern, dass sie der größten Zelle dieser spezifischen Spalte entspricht?GridLayoutManager - Spaltenbreite wrap sein eigenes größtes Kind

Es soll wie folgt aussehen:

enter image description here

Wo der orange Teil der Teil durch die Ansicht der Zelle aufgenommen ist.


EDIT

Wir fragten mich zu klären, was ich erwarte. Ein Beispiel ist besser als Worte, hier können Sie einen Screenshot eines RecyclerView mit GridLayoutManager sehen. Jedes Element ist ein einfaches TextView, das zufällig einen Text zwischen 10 & 40 Zeichen enthält. Der RecyclerView befindet sich in einem HorizontalScrollView, wie bereits erwähnt. Wir können sehen, dass jede Spalte die gleiche Breite hat, obwohl keine Elemente in dieser Spalte die gesamte Breite erfüllen können. Was ich möchte, ist diese nutzlosen leeren Raum entfernen und Spalten mit verschiedenen Größen mit jeder Spalte die Breite des eigenen größten Kind entsprechen.

enter image description here

Wenn Sie dieses Verhalten testen möchten, können Sie diese Repo klonen kann ich auf Github hochgeladen: hier

Wie gefragt https://github.com/ShargotthDev/TestGrid ist mein XML-Layout (sehr einfach):

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

Ich hätte erwähnen sollen, dass einige der Zellen eine Spangröße> 1 haben und der LayoutManager sollte vertikal sein, so dass diese Zellen mehr Platz horizontal und nicht vertikal nehmen (weiß nicht, ob ich mich verständlich mache).

Vielen Dank für Ihre Zeit!

+0

Immer noch nicht verstehen, was genau Sie wollen ?? –

+0

können Sie Ihr XML-Layout veröffentlichen? Haben Sie 'columnSpan' und' columnWeight' verwendet? –

+0

@artikyada Ich habe ein paar mehr Erklärungen und ein Repo, das du klonen kannst, um dieses Verhalten zu reproduzieren und vielleicht besser zu verstehen, was ich meine. – MHogge

Antwort

6

Sie müssen Ihren RecyclerView nicht in HorizontalScrollView ablegen. Siehe den folgenden Code.

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

Adapter Klasse

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> 

bearbeiten Zeigen Sie RecyclerView innen NestedScrollView wie dieses

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

und stellen Sie Ihre Anzahl von spanCount wie diese

spanCount = 8;

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

Akzeptieren Sie diese Antwort, wenn das Ihr Problem löst. –

+0

Das ist wirklich nett und beantwortet die Frage tatsächlich. Aber ich sollte genauer sein, die 2D-Tabelle, die ich mit dieser RecyclerView/ScrollView-Kombination erzeuge, könnte Zellen mit einer spanSize> 1 haben, aber da Ihre Lösung den LayoutManager horizontal einstellen muss, tut dies eine Zelle mit spanSize> 1 nicht Sehen Sie, wie es mit einem vertikalen LayoutManager aussieht. (Hinzu kommt, dass ich die Art und Weise, wie mein Datensatz erstellt wird, neu organisieren muss, aber das ist nicht unmöglich). PS: Ich werde nicht zurückgehen, ohne eine Antwort zu akzeptieren, wenn es wirklich mein Problem löst, mach dir keine Sorgen. – MHogge

+0

Und wenn ich keine Lösung finde, werde ich Ihre akzeptieren, da sie das Problem löst, das ursprünglich beschrieben wurde. – MHogge

Verwandte Themen