2015-08-01 23 views
5

Ich benutze RecyclerView mit GridLayout Manager, um Sitzbelegungslayout wie Reisen zu machen.Recycler View mit Gridlayout Manager

Mein Problem ist, wie man spancount automatisch erkennt, wenn meine Spalte zufällig ist?

Ich kenne spanCount = recyclerViewWidth/singleItemWidth;, aber das Problem ist singleItemWidth ist anders, da die Sitzbreite unterschiedlich ist.

Dies ist das gewünschte Layout, das ich will:

enter image description here

... aber ich bin zur Zeit so etwas wie dies bekommen:

enter image description here

Dies ist der Code I‘ m zur Anordnung des Sitzlayouts verwenden:

gridLayoutManager=new GridLayoutManager(this,totalRows, LinearLayoutManager.VERTICAL, 
      false); 
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
     @Override 
     public int getSpanSize(int position) { 
      int rows=Integer.parseInt(upperlist.get(position).get("row")); 
      return (rows);///(int) (mRecyclerView.getMeasuredWidth()/ 10); 
     } 
    }); 
    mRecyclerView.setLayoutManager(gridLayoutManager); 
    MyAdapter myAdapter=new MyAdapter(this,gridArray); 

... wo upperlist diese Werte halten:

[{cols=8, seatNumber=29U, row=4, zindex=1}, 
    {cols=6,seatNumber=23U, row=4, zindex=1}, 
    {cols=4,seatNumber=21U,row=4, zindex=1}, 
    {cols=2, seatNumber=11U, row=4, zindex=1}, 
    {cols=0,seatNumber=9U,row=4, zindex=1}, 

    {cols=8,seatNumber=25U, row=2, zindex=1}, 
    {cols=6,seatNumber=17U, row=2, zindex=1}, 
    {cols=4,seatNumber=13U, row=2, zindex=1}, 
    {cols=2,seatNumber=5U, row=2, zindex=1}, 
    {cols=10, seatNumber=D2U,row=2, zindex=1}, 
    {cols=0, seatNumber=1U, row=2, zindex=1}, 

    {cols=8, seatNumber=26U, row=1, zindex=1}, 
    {cols=6,seatNumber=18U, row=1, zindex=1}, 
    {cols=4,seatNumber=14U, row=1, zindex=1}, 
    {cols=2,seatNumber=6U, row=1, zindex=1}, 
    {cols=0,seatNumber=2U, row=1, zindex=1}] 

Dies ist eine einzige Liste, wo ich verschiedene Werte für Zeilen und Spalten habe. Ich brauche daher eine verallgemeinerte Methode, die auf allen Layouts funktionieren kann.

Antwort

3

Ich denke, der "cols" -Parameter definiert die Spalte, in der das Objekt platziert werden soll, richtig? Wenn das der Fall ist, sollten Sie den maximalen Wert aller Elemente für diesen Parameter nehmen. In diesem Fall "10". Da alle Objekte 2 Cloumns umfassen, hat jedes Element eine Span-Größe von 2 und der maximale Span-Index ist 11. Daher sollte Ihre Span-Zählung 12 sein (indizes von 0 bis 11).

Jetzt müssen Sie die leeren Räume herausfinden. Z.B. In Zeile 3 gibt es überhaupt keinen Eintrag und nach Ihren Angaben haben Zeile 1 & 4 am Ende ein leeres Element. Sie sollten also ein leeres Objekt (-> viewtype!) Definieren, das eine Leerstelle in Ihrem Layout darstellt.

Schließlich sortiert die Liste der Elemente durch ihren Zeilenindex und Spaltenindex, so dass Sie diese Struktur erreichen:

[ //row 1 
    {cols=0, seatNumber=2U, row=1, zindex=1}, 
    {cols=2, seatNumber=6U, row=1, zindex=1}, 
    {cols=4, seatNumber=14U, row=1, zindex=1}, 
    {cols=6, seatNumber=18U, row=1, zindex=1}, 
    {cols=8, seatNumber=26U, row=1, zindex=1}, 
    {cols=10, row=1, zindex=1}, //an empty element 

    //row 2 
    {cols=0, seatNumber=1U, row=2, zindex=1}, 
    {cols=2, seatNumber=5U, row=2, zindex=1}, 
    {cols=4, seatNumber=13U, row=2, zindex=1}, 
    {cols=6, seatNumber=17U, row=2, zindex=1}, 
    {cols=8, seatNumber=25U, row=2, zindex=1}, 
    {cols=10, seatNumber=D2U,row=2, zindex=1}, 

    //row 3 (just empty elements) 
    {cols=0, row=3, zindex=1}, 
    {cols=2, row=3, zindex=1}, 
    {cols=4, row=3, zindex=1}, 
    {cols=6, row=3, zindex=1}, 
    {cols=8, row=3, zindex=1}, 
    {cols=10, row=3, zindex=1}, 

    //row 4 
    {cols=0, seatNumber=9U, row=4, zindex=1}, 
    {cols=2, seatNumber=11U, row=4, zindex=1}, 
    {cols=4, seatNumber=21U, row=4, zindex=1}, 
    {cols=6, seatNumber=23U, row=4, zindex=1}, 
    {cols=8, seatNumber=29U, row=4, zindex=1}, 
    {cols=10, row=4, zindex=1} //an empty element 
] 

und den restlichen Code auf diese Weise ändern:

columnCount = computeTotalColumnCount(...); // 
addEmptyElements(...); // add empty elements to your data structure (upperList or gridArray) 

gridLayoutManager=new GridLayoutManager(this, columnCount, LinearLayoutManager.VERTICAL, 
      false); 
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
     @Override 
     public int getSpanSize(int position) { 
      return 2; 
     } 
    }); 

Wenn Sie möchten, dass die Bereichsgröße der einzelnen Elemente flexibler ist, sollten Sie jedem Element einen neuen Parameter hinzufügen, damit ein Element wie folgt aussieht:

{cols=0, seatNumber=2U, row=1, zindex=1, spansize=2} 

Sie können als Ihre SpanSizeLookup dazu ändern:

gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
     @Override 
     public int getSpanSize(int position) { 
      return Integer.parseInt(upperList.get(i).get("spansize")); 
     } 
    }); 

Ich hoffe, das hilft;)

+0

alle Dinge sehen gut aus, aber wie ein leeres Element definieren (-> Viewtype) und wie addEmptyElements hinzuzufügen (! ...); ... wie soll ich wissen? Ich habe n Anzahl von empt view erforderlich – Tufan

+0

In Bezug auf den Viewtyp könnte diese Antwort helfen: http://StackOverflow.com/a/26245463/1974562 Zum Hinzufügen von leeren Elementen, Sie sollten die Methode "addEmptyElements (...)" erstellen und alle Punkte, die kein "Bett" haben, mit leeren Elementen füllen. Es gibt leider keine Möglichkeit, dies leicht zu tun, so dass Sie z.Iteriere die Liste, extrahiere alle Positionen, die nicht von einem Bett besetzt sind, und füge an diesen Stellen leere Elemente hinzu. Sie können die Datenstruktur auch so ändern, dass Sie sie einfacher verwalten können (z. B. alle Elemente einer Zeile in einem "Row" -Objekt gruppieren). – Johannes

Verwandte Themen