Android View位置跳动问题

在Android开发中,遇到页面刷新后NestedScrollView或RecyclerView滚动位置改变的问题。原因可能是可聚焦View如RecyclerView在状态变化时尝试获取焦点,导致外部可滚动视图滚动到其位置。解决方案是在RecyclerView构造函数内禁止其获取焦点,防止滚动位置异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android View位置跳动问题

  1. 有时我们会遇到当页面刷新后,类似NestedScrollView和RecyclerView这种可滑动View的滚动位置会变化一下,和原先不一致

  2. 通过调试我们发现,是因为页面里有RecyclerView这种可以获取焦点的View,跟踪代码得知,当这种View的一些flag属性变化时:如Visibility、focusable、enable等,会尝试去requestFocus(),此时外部可滚动View,得知其child获取了焦点,于是就尝试滚动到该child的位置(有时也滚动不到,因为计算offset出错),所以会造成位置的滚动

  3. 最简单的改动就是将RecyclerView的获取焦点功能去掉即可,但是这里也有个坑,RecyclerView在构造函数里面,会默认调用setFocusableInTouchMode(true),所以我们不能在xml中配置这些属性,需要在构造函数里面调用才行

  4. 其他滚动View的跳动情况,也可以参考一下这种情况

    init {
      recyclerView = findViewById(R.id.rv)
      recyclerView.isFocusable = false
      recyclerView.isFocusableInTouchMode = false
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值