Как добавить динамическое представление между элементами RecyclerView в android?

Мне нужно добавить небольшую полосу между элементами RecyclerView. Эта полоса может появиться после различного количества элементов в списке. Это необходимо сделать динамически. Мне нужно реализовать что-то вроде того, что сделал FitBit: Введите описание изображения здесь

Мне также нужна первая строка, то есть одна, говорящая «На этой неделе», чтобы придерживаться сверху, даже если страница прокручивается вниз.

Solutions Collecting From Web of "Как добавить динамическое представление между элементами RecyclerView в android?"

Использовать библиотеку StickyHeaderRecyclerView

Он очень прост в использовании

Вы должны использовать концепцию разных типов просмотров, используя getItemViewType (int) . Затем в onCreateViewHolder (ViewGroup, int) вы можете проверить, какой тип вы должны раздувать / создавать.

Пример:

@Override public int getItemViewType(int position) { // you should return the view type, based on your own dynamic logic } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { // handle each view type accordingly } } 

Вы можете использовать концепцию нескольких типов просмотров в RecyclerView , просто используя getItemViewType() и позаботьтесь о параметре onCreateViewHolder() в onCreateViewHolder() .

Например, вы можете использовать следующую модель:

  public class Data{ int field1; float filed2; int rowType // 1,2,2,...N this will fill by you whenever you will //creating arraylist for your recyclerview } public class Custome Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { ArrayList<Data> mItems; class ViewHolderRowType1 extends RecyclerView.ViewHolder { ... } class ViewHolderRowType2 extends RecyclerView.ViewHolder { ... } .... class ViewHolderRowTypeN extends RecyclerView.ViewHolder { ... } @Override public int getItemViewType(int position) { return mItems.get(position).rowType; //or //return positon%2; // This will based on your condition } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType) { case 0: return new ViewHolderRowType0(...); case 1: return new ViewHolderRowType1(...); ... case N: return new ViewHolderRowTypeN(...); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) { //Just check which view type is going to bind and then fill the data accordingly in your rows if(vh instanceof ViewHolderRowType1){ // Fill the data for first view type } else if (vh instanceof ViewHolderRowType2) { // Fill the data for second view type } else if (vh instanceof ViewHolderRowTypeN){ // Fill the data for Nth view type } } 

Для вашего липкого «этого представления слабый» вы можете добавить его поверх своего RecyclerView а затем обработать его с помощью прокрутки «Событие RecyclerView»

Существует два способа реализовать такой RecyclerView

  1. Добавить заголовок в каждом макете и скрыть / показать на основе вашего требования (желательно).
  2. Или используйте два разных макета для заголовка и содержимого (не предпочтительнее, потому что это может вызвать проблему с общим количеством элементов в адаптере).

В вашем пользовательском классе POJO / GetterSetter добавьте одно поле для headerStatus (либо boolean, либо int), чтобы определить, показывать ли заголовок или нет.

Теперь в адаптере переопределить public int getItemViewType(int position) .

 static final int TYPE_ITEM = 0; static final int TYPE_SEPARATOR = 1; @Override public int getItemViewType(int position) { if (mData.get(position).getHeaderStatus() == 0) return TYPE_ITEM; else return TYPE_SEPARATOR; } 

Если вы хотите сделать это «правильно», без хаков, вы должны написать свой собственный LayoutManager и обработать эти случаи руками. Это не так сложно, как кажется, но приложит некоторые усилия.