我有一个RecyclerView适配器,可以处理多个视图类型,我已经使用了多年。最近,我发现了ConcatAdapter,但似乎遇到了一个问题:它返回了错误的getItemViewType()值。
我的用例需要显示一个标题和下面的项目列表。我为标题创建了一个新的适配器类,但是项目列表将继续使用我的旧适配器(它还处理其他几种视图类型)。
因此,我已将这两个适配器连接在一起:
HeaderAdapter headerAdapter = new HeaderAdapter(context);
PostAdapter postAdapter = new PostAdapter(context, postData);
ConcatAdapter concatAdapter = new ConcatAdapter(headerAdapter, postAdapter);
recyclerView.setAdapter(concatAdapter);
这个工作正常,但当我打开这个活动时,它立即崩溃并提示以下错误:
java.lang.ClassCastException: com.myapp.android.adapter.PostAdapter$PostViewHolder不能强制转换为com.myapp.android.adapter.PostAdapter$FooterViewHolder 这毫无意义,因为我从未添加过脚注到RecyclerView。
我的PostAdapter中的getItemViewType()方法看起来像这样:
@Override
public int getItemViewType(int position) {
if (data.get(position) instanceof Footer) {
return TYPE_FOOTER;
} else if (data.get(position) instanceof Post) {
return TYPE_POST;
}
return -1;
}
我的onBindViewHolder()
方法大致如下:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case TYPE_FOOTER:
FooterViewHolder vh1 = (FooterViewHolder) holder;
configureFooterViewHolder(vh1, position);
break;
case TYPE_POST:
PostViewHolder vh2 = (PostViewHolder) holder;
configurePostViewHolder(vh2, position);
break;
default:
break;
}
}
无论出于什么原因,当我运行调试器时,它会落在这一行:
FooterViewHolder vh1 = (FooterViewHolder) holder;
,尽管我从未将页脚包含在PostAdapter
的数据中。那为什么会落在这里呢?为什么ConcatAdapter会导致处理多个视图类型的适配器出现如此奇怪的行为?
Collections.unmodifiableList()
中。当你需要一个新的ArrayList时,你创建一个新的ArrayList(oldList),进行修改并将其包装在unmodifiable list中,然后将其传递给适配器。 - EpicPandaForce