我正在探索 RecyclerView
我很惊讶地发现 RecyclerView
没有 onItemClickListener()
。
我有两个问题。
主要问题
我想知道为什么谷歌删除了 onItemClickListener()
?
是否存在性能问题或其他问题?
次要问题
我通过在我的 RecyclerView.Adapter
--- 中写入 onClick
解决了我的问题:
public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
public TextView txtViewTitle;
public ImageView imgViewIcon;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
}
@Override
public void onClick(View v) {
}
}
这可以吗/有没有更好的方法?
原文由 T_V 发布,翻译遵循 CC BY-SA 4.0 许可协议
tl;dr 2016 使用 RxJava 和 PublishSubject 为点击公开一个 Observable。
原帖:
自从引入
ListView
,onItemClickListener
一直存在问题。当您拥有任何内部元素的点击侦听器时,不会触发回调,但没有通知或没有充分记录(如果有的话),因此存在很多混淆和 SO 问题。鉴于
RecyclerView
更进一步并且没有行/列的概念,而是任意布置数量的孩子,他们将 onClick 委托给每个孩子,或程序员实现。想想
Recyclerview
不是ListView
1:1 替代品,而是作为复杂用例的更灵活的组件。正如你所说,你的解决方案是谷歌对你的期望。现在您有了一个适配器,可以将 onClick 委托给构造函数上传递的接口,这是ListView
和Recyclerview
的正确模式。然后在你的适配器上
现在查看最后一段代码:
onCreateViewHolder(ViewGroup parent, int viewType)
签名已经建议了不同的视图类型。对于它们中的每一个,您也需要一个不同的视图,随后它们中的每一个都可以有一组不同的点击。或者,您可以创建一个通用的视图持有者,它可以接受任何视图和一个onClickListener
并相应地应用。或者将一个级别委托给协调器,以便多个片段/活动具有相同的列表和不同的点击行为。同样,所有灵活性都在您身边。它是一个真正需要的组件,并且与我们对
ListView
的内部实现和改进非常接近。谷歌终于承认了这一点,这很好。