我想知道如何创建一个包含MULTIPLE视图持有者的循环器视图适配器,每次使用该适配器实例化RecyclerView时,我只希望看到特定类型而不是混合类型 .
我在Android活动中有两个不同的屏幕,每个屏幕都显示一个项目/卡片列表 . 一个是文本和数字,另一个是照片 . 现在我为每个对象提供了2个不同的自定义适配器,我想要实现的是一个适配器的灵活性,它可以根据显示的屏幕在对象类型之间推迟,并仅列出我需要的行 .
我见过的所有例子都是混合型对象,而不是我所追求的 .
适配器代码附加在下面 .
public class MultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList<MYDataProvider> arrayList;
private final static int VIEW0 = 0;
private final static int VIEW1 = 1;
public MultiAdapter(ArrayList<MyDataProvider> _arrayList) {
this.arrayList = new ArrayList<>();
this.arrayList = _arrayList;
}
@Override
public int getItemViewType(int position) {
switch (position) {
case 0:
return VIEW0;
case 1:
default:
return VIEW1;
}//switch
}//get item view type
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
int layoutRes;
View view;
RecyclerView.ViewHolder viewholder;
switch (viewType) {
case VIEW0:
layoutRes = R.layout.card_item;
view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutRes, viewGroup, false);
viewholder = new E1(view);
break;
case VIEW1:
default:
layoutRes = R.layout.item_layout;
view = LayoutInflater.from(viewGroup.getContext()).inflate(layoutRes, viewGroup, false);
viewholder = new E2(view);
break;
}//switch
return viewholder;
}//on create
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case VIEW0: {
MyDataProvider mydata = arrayList.get(position);
((E1)holder).name1.setText(mydata.getD_name() + "this is item " + position);
((E1)holder).imageView1.setImageResource(arrayList.get(position).getImg_res());
}
break;
case VIEW1: {
MyDataProvider mydata = arrayList.get(position);
((E2)holder).name2.setText(mydata.getD_name() + "this is item " + position);
((E2)holder).imageView2.setImageResource(arrayList.get(position).getImg_res());
}
break;
}//switch
}//on bind
@Override
public int getItemCount() {
return arrayList.size();
}
public class E1 extends mainViewHolder {
ImageView imageView1;
TextView name1;
public E1(View itemView) {
super(itemView);
imageView1 = itemView.findViewById(R.id.image);
name1 = itemView.findViewById(R.id.d_name);
}
}//e1 class
public class E2 extends mainViewHolder {
ImageView imageView2;
TextView name2;
public E2(View itemView) {
super(itemView);
imageView2 = itemView.findViewById(R.id.person_photo);
name2 = itemView.findViewById(R.id.person_name);
}
}//e2 class
public class mainViewHolder extends RecyclerView.ViewHolder {
public mainViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}//adapter
2 回答
我不明白你的问题在哪里?你能提供更多解释吗?
//编辑
在您的代码中,您确定只有第一个项目是VIEW0类型的项目,而其他项目将是VIEW1 . 这是在
getItemViewType(int position)
函数中 .如果要确定要选择的ViewHolder,则必须在填充列表之前选择它 . 在适配器中创建枚举:
然后创建枚举变量:
并在您的构造函数中传递它:
并在
onCreateViewHolder
函数中检查您的开关中的类型(基于itemType
变量) . 请注意,switch中的变量是"itemType",而不是来自override方法的viewType .