Страницы

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

понедельник, 2 декабря 2019 г.

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

#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



У кого остались вопросы по примеру, приведённому выше, (или кто-то хочет более детально разобраться), в дополнение к примеру ссылку Вам!

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

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