Идеальным решением было бы установить два адаптера на один RecyclerView
, но, к сожалению, это невозможно.Тем не менее, вы можете создать один специальный адаптер, который обрабатывает два типа элементов.Я объясню это на примере.
Предположим, вам нужно отобразить объекты двух типов, humans
и aliens
.Ваши объекты требуют совершенно разных макетов и совершенно разных ViewHolders
.Пожалуйста, смотрите код ниже для ViewHolders
:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static class HumanViewHolder extends RecyclerView.ViewHolder {
public HumanViewHolder(View itemView) {
super(itemView);
//Prepare your ViewHolder
}
public void bind(Human human) {
//Display your human object
}
}
private static class AlienViewHolder extends RecyclerView.ViewHolder {
public AlienViewHolder(View itemView) {
super(itemView);
//Prepare your ViewHolder
}
public void bind(Alien alien) {
//Display your alien object
}
}
}
Сначала вам нужно добавить две разные константы в ваш адаптер, представляющие оба типа представлений:
private static final int ITEM_TYPE_HUMAN;
private static final int ITEM_TYPE_ALIEN;
Для простотыдавайте также предположим, что вы храните ваши объекты в списке:
private List<Object> items = new ArrayList<>();
public MyAdapter(List<Object> items) {
this.items.addAll(items);
//Other stuff if needed
}
Теперь, первое, что вам нужно сделать, это реализовать метод getItemViewType()
:
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof Human) {
return ITEM_TYPE_HUMAN;
} else {
return ITEM_TYPE_ALIEN;
}
}
Во-вторых, вынеобходимо использовать тип элемента внутри метода onCreateViewHolder()
следующим образом:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
if (viewType == ITEM_TYPE_HUMAN) {
View view = layoutInflater.inflate(R.layout.item_human, parent, false);
return new HumanViewHolder(view);
} else {
View view = layoutInflater.inflate(R.layout.item_alien, parent, false);
return new AlienViewHolder(view);
}
}
В конце вам просто нужно привязать соответствующий держатель вида следующим образом:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
Object item = items.get(position);
if (viewHolder instanceof HumanViewHolder) {
((HumanViewHolder) viewHolder).bind((Human) item);
} else {
((AlienViewHolder) viewHolder).bind((Alien) item);
}
}