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

wpbloger

Мне нужно в зависимости от типа объекта(записи), заполнить RecyclerView разными view, раньше когда я делал это с помощью ListView у меня получалось, а тут я даже не знаю как это организовать, в onCreateViewHolder сразу создается view но без учета текущей позиции, следовательно я не могу несколько разных view там создать.

Как это можно организовать?

3 ответа

wpbloger

Для создания айтемов разного вида необходимо переопределить метод адаптера getItemViewType(), который будет в зависимости от условия определять, айтем какого вида требуется в данной позиции. В RecyclerView этот механизм был улучшен и метод onCreateViewHolder() возвращает значение ViewType - какой тип айтема требуется в данной позиции:

class MyAdapter extends RecyclerView.Adapter <myadapter.itemholder> {

    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);
    }
 }
</myadapter.itemholder>


wpbloger

Можно писать свой адаптер, как ответил @pavlofff, можно воспользоваться готовыми библиотеками: https://github.com/vivchar/RendererRecyclerViewAdapter https://github.com/sockeqwe/AdapterDelegates


wpbloger

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

licensed under cc by-sa 3.0 with attribution.