Мне нужно в зависимости от типа объекта(записи), заполнить RecyclerView разными view, раньше когда я делал это с помощью ListView у меня получалось, а тут я даже не знаю как это организовать, в onCreateViewHolder сразу создается view но без учета текущей позиции, следовательно я не могу несколько разных view там создать.
Как это можно организовать?
Ответ
Для создания айтемов разного вида необходимо переопределить метод адаптера 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);
}
}
Комментариев нет:
Отправить комментарий