2015-08-01 15 views
5

Sto usando RecyclerView con il manager GridLayout per rendere il layout di prenotazione del posto come i viaggi.Vista Recycler con Gridlayout Manager

Il mio problema è come rilevare automaticamente lo spancount quando la colonna è casuale?

Conosco spanCount = recyclerViewWidth/singleItemWidth;, ma il problema è singleItemWidth è diverso, poiché la larghezza del sedile è diversa.

Questo è il layout desiderato che voglio:

enter image description here

... ma Attualmente sto ottenendo qualcosa di simile:

enter image description here

Questo è il codice che ho' m utilizzando per organizzare il layout del sedile:

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

... dove upperlist tenere questi valori:

[{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}] 

Questa è una lista unica, dove sto avendo valori diversi per righe e colonne. Ho quindi bisogno di un metodo generalizzato che possa funzionare su tutti i layout.

risposta

3

Immagino che il parametro "cols" definisca la colonna in cui posizionare l'elemento, giusto? In questo caso, si dovrebbe prendere il valore massimo di tutti gli articoli per questo parametro. In questo caso "10". Poiché tutti gli elementi sembrano occupare 2 cloumn, ogni elemento ha una dimensione di span di 2 e l'indice di span massimo è 11. Pertanto il tuo span-count dovrebbe essere 12 (ind. Da 0 a 11).

Ora dovrai capire gli spazi vuoti. Per esempio. non vi è alcun elemento nella riga 3 e in base ai dati, riga 1 & 4 hanno un elemento vuoto alla fine. Quindi dovresti definire un oggetto vuoto (-> viewtype!) Che rappresenta uno spazio vuoto nel tuo layout.

Infine, ordinare l'elenco degli articoli per il loro indice di riga-index e della colonna, in modo che a raggiungere tale struttura:

[ //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 
] 

e modificare il codice rimanente in questo modo:

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

Se desideri che la dimensione di span di ciascun elemento sia più flessibile, devi aggiungere un nuovo parametro a ciascun elemento, in modo che un elemento appaia così:

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

È possibile che modificare la SpanSizeLookup a questo:

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

Spero che questo aiuta;)

+0

ogni cose guarda bene, ma come definire un elemento vuoto (-> viewType) e come aggiungere addEmptyElements (! ...); ... come dovrei sapere di avere n numero di vista empt richiesta – Tufan

+0

Per quanto riguarda il viewtype, questa risposta potrebbe aiutare: http://stackoverflow.com/a/26245463/1974562 Per come aggiungere elementi vuoti, dovresti creare il metodo "addEmptyElements (...)" e riempire tutti gli spazi che non hanno "letto" con elementi vuoti. Purtroppo non c'è modo di farlo facilmente, quindi dovrai ad es.scorrere l'elenco, estrarre tutte le posizioni che non sono occupate da un letto e aggiungere elementi vuoti in queste posizioni. Puoi anche cambiare la struttura dei dati in qualcosa che ti consente di gestirlo più facilmente (ad esempio raggruppare tutti gli articoli di una riga in un oggetto "Riga") – Johannes