我有一个RecyclerView适配器,它可以处理我已经使用多年的几种视图类型。最近,我发现了关于ConcatAdapter
,但我似乎遇到了一个问题,它似乎为getItemViewType()
返回了错误的值。
我有一个用例,我想显示一个标题,下面是一个项目列表。我已经为标题创建了一个新的适配器类,但是列表项将继续使用我的旧适配器(它还处理其他几种视图类型)。
因此,我连接了两个适配器:
HeaderAdapter headerAdapter = new HeaderAdapter(context);
PostAdapter postAdapter = new PostAdapter(context, postData);
ConcatAdapter concatAdapter = new ConcatAdapter(headerAdapter, postAdapter);
recyclerView.setAdapter(concatAdapter);
这工作正常,但是当我打开活动时,它立即崩溃并给出错误:
JAVAlang.ClassCastException:com。我的应用程序。Android适配器。PostAdapter$PostViewHolder无法强制转换为com。我的应用程序。Android适配器。PostAdapter$FooterViewHolder
这毫无意义,因为我甚至从未在“回收者”视图中添加页脚。
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;
}
}
但是,无论出于什么原因,当我运行调试器时,它会落在行FolterViewHolder vh1=(FolterViewHolder)持有人;
上,尽管我从未将页脚作为PostAdapter
数据的一部分。
那它为什么会降落在这上面呢?为什么ConcatAdapter会在处理多种视图类型的适配器中导致如此奇怪的行为?
似乎是故意的。经过一点调试,我发现适配器。这一行中的getItemViewType(localPosition)
是正确的,但是ConcatAdapter还做了一个我从未配置过的额外的“从本地到全局项目视图类型的转换”,但至少它覆盖了我最初想要做的事情。
因此,您根本看不到本地项目视图类型值,您只需从ConcatAdapter中获得一些随机分配的索引。因为所有这些都是私有的,所以您唯一的选择就是反射。
祝你好运
(好的,对于真正的答案,您还可以启用ConcatAdapter.Config(isolateViewTypes=false)
,确保所有项目视图类型彼此不同,它们实际上是不同的,而不是只返回0
或return super)。getItemViewType(position)
左右,然后getItemViewType
将不会创建本地-
val concatAdapter = ConcatAdapter(
ConcatAdapter.Config.Builder()
.setIsolateViewTypes(false)
.build(),
绑定视图持有者时,应使用RecyclerView。适配器。getItemViewType(位置),而不是RecyclerView。视窗持有人。getItemViewType():
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)) { // not 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;
}
}
您得到了一个错误,因为视图持有者被回收,它可能是任何视图持有者,因此当您强制将其强制转换到错误的类时,它抛出了ClassCastException
。
问题内容: 从以下代码 如果我添加一个return语句,它将起作用,并且错误消失了 任何建议都不确定如何在没有虚拟return语句的情况下处理上述问题。 这是我的课程测试 编辑 我已经完成了一个基于操场的简约示例(请复制粘贴以进行测试) 问题答案: 任何建议都不确定如何在没有虚拟return语句的情况下处理上述问题。 您已经很好地解决了问题。匿名函数自动使用单行函数主体作为返回值,因此,要防止这种
问题内容: 根据手册页: 返回值 成功完成后,将返回0。否则,将返回并且设置全局变量以指示错误。在任何一种情况下,对该流的任何进一步访问(包括对的另一个调用)都会导致未定义的行为。 错误 底层的文件描述符无效。 该函数也可能会失败,并设置为例程指定的任何错误,或者。 当然应该失败,但是我希望它以正常方式返回,而不是直接因分段错误而死亡。是否有任何这种行为的原因? 提前致谢。 更新:我将把代码放在这
问题内容: 我不了解这种情况下的行为。据我了解,带有无效子查询的查询应导致错误。但在此示例中,它返回一些行。 测试数据: 可以正常工作: 但是下面的查询也是在检索行,显然是通过从“ test_values”表中获取“ test_id2”列,而不是从子查询中所述的“ test_lookup”表中获取,尽管未在内部和外部使用别名部分。 问题答案: 原因是因为当子查询中不存在非别名列,但外部查询中确实存
基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par
问题内容: 由于某些原因,我的fx:id无法正确绑定到我的类,因此始终会导致错误。 控制者 XML文件 我认为我了解问题的根源,但不了解如何正确解决。根据这个问题的答案,我认为我正在尝试在调用构造函数之前分配FXML元素(并且这些元素只能在初始化期间/之后分配)。 有没有办法 不 执行此操作?还是我犯了一个完全不同的错误? 问题答案: 您使用进口 在您的fxml文件中。 因此,在加载fxml文件时
启用proguard规则后,我在向网络发送任何内容之前遇到以下错误。 java.lang.RuntimeException:无法将FormDocTankPermission转换为RequestBody 引起的 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类FormDocTankPermission的序列化程序,也