Google为什么不为Android中的RecyclerView添加Item的点击监听器
正好前不久做过RecycleView的源码分析,这里说明一下好了。。
其中一个原因是RecyclerView的Item支持动画。。举个栗子。如果你开启了RecyclerView的Item动画,当你删除了position位于1的Item之后, 此时位于23456...的position会向前一格变成12345,而被删除的那个view也会留在RecycleView上继续执行动画直到结束。如下图所示
于是这时候RecycleView中会留有两个position为1的View....
此时点击那个被删除的view的话就蛋疼了。。
因为Adapter中已经没有这个item了,如果用position 1去adapter中取的话,得到的是原来positon为2的那个item.....另外,RecyclerView的设计也有很大一部分原因,按照RecyclerView的设计,RecyclerView负责控制/框架,LayoutManager负责计算布局,假设将ItemClickListener放到RecyclerView上,如果要实现点击事件,首先需要确定每一个item的点击区域。但是RecyclerView无法知道每一个item的点击区域,因为LayoutManager是可以由开发者来实现的,也就是说两个View的区域是允许重叠的。如果点了A和B重叠区域到底是触发A还是B,又必须要由LayoutManager来决定。所以还不如直接放到LayoutManager中,但如果放到LayoutManager中的话需要给RecyclerView添加OnTouchListener,看上去又很别扭(要是外部给RecyclerView设置OnTouchListener会覆盖掉这个导致ItemClickListener失效)
所以google干脆就不干了,至少还能保持源码的整洁-。-(ListView中有一个很复杂的状态机就是用来维护Click点击态的)
查看评论 回复