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


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

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

5 15

5 ответов:

Использовать библиотека 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(), и позаботьтесь о параметре viewType в 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), чтобы определить, показывать заголовок или нет.

Теперь в Adapter override 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;
}

Теперь во время раздувания макета в getView() Вы можете проверить тип строки по

int rowType = getItemViewType(position);

Для случая 1 вам нужно увидеть заголовок и установить в нем соответствующие данные. Для случая 2 вам нужно раздуть этот макет заголовка и добавить в него соответствующие данные.

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