2015-04-16 8 views
8

Hier ist mein SzenarioAndroid RecyclerView finden auf ItemDecoration ersten und letzten Blick aus

  • ich Raum hinzufügen müssen auf den ersten und letzten Punkt der Recycler Ansicht
  • Ich tue so ItemDecoration

    recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { 
    
    
        @Override 
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
         int totalHeight = parent.getHeight(); 
         int viewHeight = getResources().getDimensionPixelOffset(R.dimen.breadcrumb_btn_height); 
         int padding = (totalHeight - viewHeight)/2; 
         //to position view on middle 
         if (view.getTag() instanceof Integer) { 
          int position = (int) view.getTag(); 
          if (position == 0) { 
           //first position 
           outRect.set(padding, padding, 0, padding); 
          } else if (position == linearLayoutManager.getItemCount() - 1) { 
           //last position 
           outRect.set(0, padding, padding, padding); 
          } else { 
           outRect.set(0, padding, 0, padding); 
          } 
         } 
    
    
        } 
    }); 
    
    mit

    Hier habe ich

  • LinearLayoutManager mit Horizontal Orientation

    I position Tag auf RecyclerView Adapter in der folgenden Art und Weise Elemente auf ItemDecoration so dass später auf Entfernen und Hinzufügen von

    @Override 
    public void onBindViewHolder(BreadCrumbViewHolder holder, int position) { 
    holder.setPosition(position); 
    } 
    

    Gibt es eine andere Art und Weise hat keinen Zugriff auf RecyclerView erstes und letztes Kind bin Hinzufügen Problem.

Antwort

30

Gibt es eine andere Art und Weise RecyclerView den Zugriff auf erste und letzte Kind auf ItemDecoration so dass später zum Entfernen und Hinzufügen von Elementen nicht irgendein Problem haben.

Ja. Sie können erreichen, was Sie wollen, nur indem Sie Ihre eigenen implementieren.

Um die aktuelle Artikel/Kind Position zu erhalten:

int position = parent.getChildAdapterPosition(view); 

die Anzahl der Elemente/Childs Um:

int itemCount = state.getItemCount(); 

Damit Sie einen Raum auf dem ersten hinzufügen und letzten Kind deiner RecyclerView.


Jetzt Ihren Code für diesen Ansatz zu ändern Sie erhalten:

@Override 
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
    super.getItemOffsets(outRect, view, parent, state); 

    //your padding... 

    final int itemPosition = parent.getChildAdapterPosition(view); 
    if (itemPosition == RecyclerView.NO_POSITION) { 
     return; 
    } 

    final int itemCount = state.getItemCount(); 

    /** first position */ 
    if (itemPosition == 0) { 
     outRect.set(padding, padding, 0, padding); 
    } 
    /** last position */ 
    else if (itemCount > 0 && itemPosition == itemCount - 1) { 
     outRect.set(0, padding, padding, padding); 
    } 
    /** positions between first and last */ 
    else { 
     outRect.set(0, padding, 0, padding); 
    } 
} 

Bonus: Wenn Sie Polsterung für alle Elemente des RecyclerView werfen Sie einen Blick auf die zu geben suchen Gist Ich habe erstellt: https://gist.github.com/ryanamaral/93b5bd95412baf85a81a

+1

Awesome Mann. Vielen Dank. Fügen Sie stattdessen 'parent.getChildPosition (view)' anstelle von 'parent.getChildAdapterPosition (view)' hinzu. – laaptu

+0

@laaptu Die getChildPosition-Methode ist veraltet. In der Dokumentation wird getChildAdapterPosition oder getChildLayoutPosition angegeben. –

+1

In diesem Fall sollten Sie 'getChildLayoutPosition (view)' in Kombination mit 'state.getItemCount()' anstelle von 'getChildAdapterPosition (view)' verwenden. Sie berücksichtigen die Positionen im aktuellen Layout-Durchlauf, die weniger aktuell sein können als die Positionen im Adapter. – BladeCoder

Verwandte Themen