68

Ich möchte Raster-Layout mit Abschnittsüberschriften implementieren. Denken Sie an https://github.com/TonicArtos/StickyGridHeadersBereich für Elemente in GridLayoutManager mit SpanSizeLookup festlegen

Was ich jetzt tun:

mRecyclerView = (RecyclerView) view.findViewById(R.id.grid); 
mLayoutManager = new GridLayoutManager(getActivity(), 2); 
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_HEADER: 
         return 1; 
        case MyAdapter.TYPE_ITEM: 
         return 2; 
        default: 
         return -1; 
       } 
      } 
     }); 

mRecyclerView.setLayoutManager(mLayoutManager); 

Nun sind beide reguläre Elemente und Header Spannweite Größe von 1 haben Wie kann ich dieses Problem lösen?

+0

diese Implementierung sieht für mich richtig aus. Haben Sie debuggen, wenn Ihre 'mAdapter.getItemViewType (position)' den richtigen Wert zurückgibt? – yigit

+0

"1" scheint wie ein sicherer Standardwert als "-1". – BladeCoder

Antwort

109

Das Problem war, dass die Header sollte Spanne Größe von 2 und regelmäßige Element sollte Spanne Größe von 1. So richtig Implementierungen haben, ist:

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_HEADER: 
         return 2; 
        case MyAdapter.TYPE_ITEM: 
         return 1; 
        default: 
         return -1; 
       } 
      } 
     }); 
+8

get span size-Methode bestimmt die Höhe der Spannweite, die Ihre Zelle braucht, nicht die Anzahl der Spalten, die sie haben sollten !! –

+0

Wenn das erste Element überspannt wird, wird die Höhe der nächsten Elemente durcheinander gebracht. Es funktioniert bei jedem anderen Gegenstand. Irgendeine Idee ? –

+0

@RonnyShibley jede Lösung für das Problem, das Sie oben angegeben ... Ich bin auch mit dem gleichen Problem konfrontiert, erste Artikel nach der Kopfzeile zeigt nicht, andere werden alle angezeigt, wie erforderlich – Umair

19

Kopf eine Spannweite gleich der Spanne Zählung haben sollte die ganze Liste.

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
    @Override 
    public int getSpanSize(int position) { 
      switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_HEADER: 
         return mLayoutManager.getSpanCount(); 
        case MyAdapter.TYPE_ITEM: 
         return 1; 
        default: 
         return -1; 
       } 
    } 
}); 
1

Antwort auf meine eigene Frage: überschreiben Sie das getSpanSizeLookup() aus der Aktivität nach den Adapter setzen.