Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Как использовать несколько view в RecyclerView

Мне нужно в зависимости от типа объекта(записи), заполнить 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); } }

Комментариев нет:

Отправить комментарий