我有一个 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
这没有任何意义,因为我什至从未在回收站视图中添加页脚。
我的getItemViewType()
方法PostAdapter
看起来像这样:
@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
s 数据的一部分。
那么它为什么会落在这上面呢?为什么 ConcatAdapter 会在处理多种视图类型的适配器中导致这种奇怪的行为?