V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
AifeiI
V2EX  ›  Android

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

  •  
  •   AifeiI · Jan 18, 2017 · 14987 views
    This topic created in 3390 days ago, the information mentioned may be changed or developed.
    大家有没有遇到这个问题?

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

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

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

    是 RecyclerView.ViewFlinger 线程监听到, ScrollerCompat.computeScrollOffset() 返回了 true 。
    AifeiI
        9
    AifeiI  
    OP
       Jan 19, 2017
    终于解决,只要继承 LinearLayoutManager ,重写其中的 requestChildRectangleOnScreen 方法,默认返回 false 就 ok 了
    xshengcn
        10
    xshengcn  
       Jan 19, 2017
    没这么麻烦, 直接在 recyclerview 上加上
    android:descendantFocusability="blocksDescendants"
    就行
    xshengcn
        11
    xshengcn  
       Jan 19, 2017
    @xshengcn 实验了一下好像 edittext 不能点击了😢
    AifeiI
        12
    AifeiI  
    OP
       Jan 19, 2017
    @xshengcn 你说的我是试过的,不然也不会提出这个问题啦
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2473 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 1000ms · UTC 09:18 · PVG 17:18 · LAX 02:18 · JFK 05:18
    ♥ Do have faith in what you're doing.