Я пытался найти решение, но я думаю, что ни у кого не было такой проблемы.
Так что я использовал 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
.Есть идеи, как к этому подойти.