我试图找到解决方案,但我认为没有人遇到这样的问题。
所以,我一直在使用ListView
中我的大部分项目,我觉得这是在不必方面更加灵活的Bind
与ViewHolder
你需要做的RecyclerView
。但因为我需要做出一个水平listview
,我可以很容易地做到这一点与LayoutManager
使用RecyclerView
。完美运作。
但是现在我使用了多个ViewHolders
,RecyclerView
因为我需要为的不同项显示不同的视图RecyclerView
。使用下面的代码,它再次可以完美地工作。
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<Item> data;
private Context context;
// Item.Type is an enum, used to differentiate the view types.
public MyAdapter(List<Item> list, Context context) {
this.data = list;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(data.get(viewType).getType() == TYPEA) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_a, parent, false);
return new ViewHolderA(itemView);
}
else {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_b, parent, false);
return new ViewHolderB(itemView);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if ( data.get(position).getType()== TYPEA ){
ViewHolderA viewHolder = (ViewHolderA) holder;
...
}
else if (data.get(position).getType()== TYPEB){
ViewHolderB viewHolder = ((ViewHolderB) holder);
...
}
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return data.size();
}
}
因此,当我重新排列用于显示项目的列表时,就会出现问题。例如,我从列表中的1开始TYPEB
,它可以正确显示。但是现在我想在列表中添加新项,但要从头开始,因此将TYPEB
其推迟。所以我添加了一个新项目,TYPEA
列表看起来像[TYPEA,TYPEB]
。ViewHolderA
是为TYPEA
并且类似地ViewHolderB
为TYPEB
在这种情况下,线里面 onBindViewHolder
ViewHolderA viewHolder = (ViewHolderA) holder;
给我抛出一个错误,说ViewHolderB
不能转换为ViewHolderA
。这表明重新排列列表后,适配器针对调用onBindViewHolder
了错误的ViewHolder
实例positon
。任何想法如何解决这个问题。
您需要在此处指定唯一的ID,而不必返回位置:
@Override
public int getItemViewType(int position) {
return data.get(position).getType()
}
当然,您必须将viewType参数用作类型而不是位置:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == TYPEA) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_a, parent, false);
return new ViewHolderA(itemView);
}
else {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.type_b, parent, false);
return new ViewHolderB(itemView);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句