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

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