2017-10-03 2 views
4

J'essaie de mettre en œuvre subheaders à l'intérieur de mon RecyclerView. Comme l'adaptateur pour mon RecyclerView, j'utilise le PagedListAdapter du nouveau Paging Library avec la combinaison de Room.Comment implémenter des sous-titres/sections dans un RecyclerView?

Les données de la base de données contiennent des dates. Je veux séparer/grouper les articles par jour et montrer la date à l'intérieur du sous-titre.

Quelle serait la meilleure façon de mettre en œuvre subheaders avec cette combinaison? Il est AFAIK qu'il est impossible d'implémenter ceci la façon ViewType 'standard', parce que cela remplacerait le premier élément de liste de données avec l'en-tête. En ce moment j'essaye de l'accomplir avec RecyclerView.ItemDecoration, mais je ne suis pas capable de le faire fonctionner.

Quelqu'un peut-il me diriger dans la bonne direction?

Jusqu'à présent, mon RecyclerView.ItemDecoration:

public class RecyclerViewHeaderItemDecoration extends RecyclerView.ItemDecoration { 

private RecyclerViewHeaderReceiver receiver; 

public RecyclerViewHeaderItemDecoration setReceiver(RecyclerViewHeaderReceiver receiver) { 
    this.receiver = receiver; 
    return this; 

} 

@Override 
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { 

    final int childCount = parent.getChildCount(); 
    for (int i = 0; i < childCount; i++) { 
     if (receiver != null) { 
      View view = parent.getChildAt(i); 
      int position = parent.getChildAdapterPosition(view); 
      int previousPosition = position - 1; 
      if (position == 0 || (position != RecyclerView.NO_POSITION && receiver.isNewSection(previousPosition, position))) { 
       ViewHolder headerView = receiver.getSectionHeaderViewHolder(position); 
       parent.getAdapter().bindViewHolder(headerView, position); // I was not able to 'insert' a new viewHolder 
      } 
     } 
    } 
} 

public interface RecyclerViewHeaderReceiver { 
    boolean isNewSection(int prevPosition, int position); 
    ViewHolder getSectionHeaderViewHolder(int position); 
} 
} 

Répondre