#android #android_view #recyclerview
Мне нужно в зависимости от типа объекта(записи), заполнить RecyclerView разными view,
раньше когда я делал это с помощью ListView у меня получалось, а тут я даже не знаю
как это организовать, в onCreateViewHolder сразу создается view но без учета текущей
позиции, следовательно я не могу несколько разных view там создать.
Как это можно организовать?
Ответы
Ответ 1
Для создания айтемов разного вида необходимо переопределить метод адаптера getItemViewType(),
который будет в зависимости от условия определять, айтем какого вида требуется в данной
позиции. В RecyclerView этот механизм был улучшен и метод onCreateViewHolder() возвращает
значение ViewType - какой тип айтема требуется в данной позиции:
class MyAdapter extends RecyclerView.Adapter {
private final int TYPE_ITEM1 = 0;
private final int TYPE_ITEM2 = 1;
public MyAdapter () {
// конструктор адаптера
}
@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
switch (viewType) {
// инфлейтим нужную разметку в зависимости от того,
// какой тип айтема нужен в данной позиции
case TYPE_ITEM1:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item1,
parent, false);
break;
case TYPE_ITEM2:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item2,
parent, false);
}
return new ItemHolder(v);
}
@Override
public void onBindViewHolder( ItemHolder holder, int position) {
// Получаем тип айтема в данной позиции для заполнения его данными
int type = getItemViewType(position);
switch (type) {
case TYPE_ITEM1:
holder.mText1.setText("биндим данные в айтем типа 1");
break;
case TYPE_ITEM2:
holder.mText2.setText("биндим данные в айтем типа 2");
break;
}
}
@Override
public int getItemViewType(int position) {
// условие для определения айтем какого типа выводить в конкретной позиции
if (position == <условие>) return TYPE_ITEM1;
return TYPE_ITEM2;
}
public static class ItemHolder extends RecyclerView.ViewHolder{
TextView mText1;
TextView mText2;
public ItemHolder(View v) {
super(v);
mText1 = (TextView) v.findViewById(R.id.text1);
mText2 = (TextView) v.findViewById(R.id.text2);
}
}
Ответ 2
Можно писать свой адаптер, как ответил @pavlofff, можно воспользоваться готовыми
библиотеками:
https://github.com/vivchar/RendererRecyclerViewAdapter
https://github.com/sockeqwe/AdapterDelegates
Ответ 3
У кого остались вопросы по примеру, приведённому выше, (или кто-то хочет более детально
разобраться), в дополнение к примеру ссылку Вам!