Здравствуйте!
Создайте свои константы, которые будут соответствовать разным типам.
private final static String VIEW_TYPE_TEXT = "text";
private final static String VIEW_TYPE_IMAGE = "image";
После чего в вашем Adapter(е) переопределите метод getItemViewType(int position) - этот метод будет брать элемент из вашего списка по позиции, проверять к какому типу он относится и возвращаться int значение.
@Override
public int getItemViewType(int position) {
switch (dataTypes.get(position)){
case VIEW_TYPE_TEXT:
return 0;
case VIEW_TYPE_IMAGE:
return 1;
}
}
Дальше все просто. В методе onCreateViewHolderесть параметр viewTypeсмотрите чему он равен и создаете ваш ViewHolder. Здесь на самом деле лучше использовать константы для типов item.
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
switch (viewType){
case 0:
{
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_text, parent, false);
return new DataViewHolder(view);
}
case 1:
{
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_image, parent, false);
return new DataViewHolder(view);
}
}
return null;
}
В методе onBindViewHolder вам нужно будет привести ваш ViewHolder к нужному типу и передать нужные вам данные из вашей коллекции.
Код целиком:
public class TestAdapter extends RecyclerView.Adapter
{
private final static String VIEW_TYPE_TEXT = "text";
private final static String VIEW_TYPE_IMAGE = "image";
private List<String> dataTypes;
public TestAdapter(List<String> dataTypes){
this.dataTypes = dataTypes;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
switch (viewType){
case 0:
{
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_text, parent, false);
return new DataViewHolder(view);
}
case 1:
{
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_data_image, parent, false);
return new DataViewHolder(view);
}
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()){
case 0:{
String data = dataTypes.get(position);
TextViewHolder textViewHolder = (TextViewHolder) holder;
textViewHolder.bind(data);
}
case 1:{
String data = dataTypes.get(position);
ImageViewHolder imageViewHolder = (ImageViewHolder) holder;
imageViewHolder.bind(data);
}
}
}
@Override
public int getItemCount() {
return dataTypes.size();
}
@Override
public int getItemViewType(int position) {
switch (dataTypes.get(position)){
case VIEW_TYPE_TEXT:
return 0;
case VIEW_TYPE_IMAGE:
return 1;
}
}
}
Надеюсь вам это поможет, если будут вопросы - спрашивайте.
p.s. обновлен в соотвествии с замечанием @pavloff.