Ответ 1
Используйте панель StickyHeaderRecyclerView
Очень легко использовать
Мне нужно добавить небольшую полосу между элементами RecyclerView. Эта полоса может появиться после различного количества элементов в списке. Это необходимо сделать динамически.
Мне нужно реализовать что-то вроде того, что сделал FitBit:
Мне также нужна первая строка, то есть одна, говорящая "На этой неделе", чтобы придерживаться сверху, даже если страница прокручивается вниз.
Используйте панель 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
, а затем обработать его прокруткой Event of RecyclerView
Существует два способа реализовать такой RecyclerView
В вашем пользовательском классе 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 и обработать эти случаи руками. Это не так сложно, как кажется, но приложит некоторые усилия.