RecyclerView 使用水平滚动的 LinearLayoutManager 时,焦点丢失问题

2017-01-18 17:50:28 +08:00
 AifeiI
大家有没有遇到这个问题?

设置 RecyclerView 的 LayoutManager 为 LinearLayoutManager ( LinearLayoutManager.HORIZONTAL ),并且 ItemView 里面含有 EditText 。当位置为第三或以上的 ItemView 中的 EditText 获得焦点时, RecyclerView 会自动滚动到第一个 ItemView 的位置。

当改为 LinearLayoutManager.VERTICAL 时,不会出现以上问题。
11309 次点击
所在节点    Android
12 条回复
KNOX
2017-01-19 00:09:27 +08:00
item 的 width 是 match_parent ?
AifeiI
2017-01-19 08:34:40 +08:00
@KNOX 固定值,例如 200dp
KNOX
2017-01-19 09:02:52 +08:00
@AifeiI 有没有试试把 EditText 设置 focusableInTouchMode 为 true
AifeiI
2017-01-19 09:56:37 +08:00
@KNOX 主要是第一个和第二个 ItemView 中的 EditText 是可以正常点击并获得焦点。另外有一个情况是,一个屏幕宽度最多是显示两个 ItemView ,所以当滑动屏幕显示出第三个 ItemView 时,点击第三个 ItemView 上的 EditText 就会让 RecyclerView 自动滚动到第一个 ItemView 的位置。
AifeiI
2017-01-19 09:58:06 +08:00
@KNOX LinearLayoutManager.VERTICAL 的时候就不会出现这个情况,无论点击第几个 ItemView 都是正常的。我觉得有可能是 LinearLayoutManager.HORIZONTAL 的时候,弹出键盘时,让 RecyclerView 进行了重绘的情况
KNOX
2017-01-19 10:06:24 +08:00
LinearLayoutManager.VERTICAL 也可能在同时设置了 paddingTop 和 clipToPadding(false) 时获取焦点滑动到顶部。
KNOX
2017-01-19 10:08:26 +08:00
@AifeiI 所以我觉得是焦点的问题,可以设置 RecyclerView 在 ACTION_DOWN 时才获取焦点。
AifeiI
2017-01-19 10:21:26 +08:00
从调试信息上看,触发的方法栈:

RecyclerView.ViewFlinger.run() [line:4645]
LinearLayoutManager.scrollHorizontallyBy(...)
...
RecyclerView.requestLayout()

是 RecyclerView.ViewFlinger 线程监听到, ScrollerCompat.computeScrollOffset() 返回了 true 。
AifeiI
2017-01-19 11:43:21 +08:00
终于解决,只要继承 LinearLayoutManager ,重写其中的 requestChildRectangleOnScreen 方法,默认返回 false 就 ok 了
xshengcn
2017-01-19 15:03:16 +08:00
没这么麻烦, 直接在 recyclerview 上加上
android:descendantFocusability="blocksDescendants"
就行
xshengcn
2017-01-19 15:08:25 +08:00
@xshengcn 实验了一下好像 edittext 不能点击了😢
AifeiI
2017-01-19 16:17:00 +08:00
@xshengcn 你说的我是试过的,不然也不会提出这个问题啦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/335443

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX