RecyclerView中某项Item无法点击问题

踩坑

其实之前也遇到过这个问题,用户说recyclerview中某个item无法点击,是oppo某一机型,但是在其他手机和模拟器都没有出现该问题,以为只是oppo特定版本系统的兼容性问题。
然后在最近提测的一个版本中很多手机也出现了类似的问题(我经常用模拟器运行调试,以及自己手机最新MIUI11安卓10,都没有发现这种问题)。recyclerview中,第一项中的子内容可以点击,但是第二项点击无效,获取不了焦点,滑动到第三项又可以。

原因

回去思考了一下,注意到每次这个recyclerview加载内容后,他的第一项的第一个EditText总是第一时间获取了焦点,并且有光标在闪烁。所以考虑,应该是Item布局中的EditText第一时间获取焦点导致的,而且滑动的时候,我的recyclerview一屏,只有2项,所以夺去了第二项的焦点,滑动到第三项的时候,第一项可能已经被回收,释放了焦点,所以又可以点击了。

寻找答案

然后Google了一下EditeText不在一开始获取焦点,没想到这个问题在stack overflow中也很多赞,2k+,回答也结果也很实用。
一般都是采取在其父布局中添加 android:focusableInTouchMode="true"属性。直译理解是,允许在触摸模式中获取焦点。
如此设置后recyclerview滑动时,因为会点击到父布局,所以会把EditText的焦点移除了,从而避免即使滑动EditText也持有焦点的问题。
而我是采用了另外一种方案,额外添加android:descendantFocusability="beforeDescendants"属性,直译理解是,子孙布局焦点配置。beforeDescendants意思是在子孙布局之前获得焦点,即优先度高于子布局。

结论

如果你也是跟我一样,在RecyclerView的Item中使用EditText,那么建议你在顶层容器布局中,添加

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

推荐阅读更多精彩内容