V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AifeiI
V2EX  ›  Android

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

  •  
  •   AifeiI · 2017-01-18 17:50:28 +08:00 · 10843 次点击
    这是一个创建于 2872 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大家有没有遇到这个问题?

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

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

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

    是 RecyclerView.ViewFlinger 线程监听到, ScrollerCompat.computeScrollOffset() 返回了 true 。
    AifeiI
        9
    AifeiI  
    OP
       2017-01-19 11:43:21 +08:00
    终于解决,只要继承 LinearLayoutManager ,重写其中的 requestChildRectangleOnScreen 方法,默认返回 false 就 ok 了
    xshengcn
        10
    xshengcn  
       2017-01-19 15:03:16 +08:00
    没这么麻烦, 直接在 recyclerview 上加上
    android:descendantFocusability="blocksDescendants"
    就行
    xshengcn
        11
    xshengcn  
       2017-01-19 15:08:25 +08:00
    @xshengcn 实验了一下好像 edittext 不能点击了😢
    AifeiI
        12
    AifeiI  
    OP
       2017-01-19 16:17:00 +08:00
    @xshengcn 你说的我是试过的,不然也不会提出这个问题啦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2993 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:15 · PVG 19:15 · LAX 03:15 · JFK 06:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.