Android的NestedScrollView 嵌套导致RecyclerView 的scrollToPosition方法失效的解决办法

我们在开发过程中使用RecyclerView加上头布局和尾布局可以解决大部分业务场景需求,但是也有部分复杂的场景需要NestedScrollView嵌套RecyclerView来完成,这个时候如果用到RecyclerView的scrollToPosition方法会发现是无效的,网上也有各种各样的解决办法,试了很多发现都无法满足需求,如果跟我一样需要在NestedScrollView嵌套下滚动到RecyclerView指定的Item位置处可以试试一下办法:

//通过RecycleView的Adapter找到指定子视图View
var tvTest = adapter.getViewByPosition(0, R.id.tv_test) as TextView
//测量某View相对于屏幕的距离
var intArray4 = IntArray(2)
tvTest.getLocationOnScreen(intArray4)
//调用滚动方法
scrollByDistance(intArray4[1])

需要声明一个临时变量 

var nestedScrollViewTop = 0
/**
 * 滚动到指定位置
 */
fun scrollByDistance(dy: Int) {
   if (nestedScrollViewTop === 0) {
       val intArray = IntArray(2)
       nestedScroll.getLocationOnScreen(intArray)
       nestedScrollViewTop = intArray[1]
    }
   //必须算上nestedScrollView本身与屏幕的距离
   val distance: Int = dy - nestedScrollViewTop 
   //添加上这句滑动才有效
   nestedScroll.fling(distance) 
   nestedScroll.smoothScrollBy(0, distance)
}

原理其实很简单,既然RecyclerView的scrollToPosition方法失效,那索性就不用了,滑动就全权交给NestedScrollView了,只有找到NestedScrollView布局下的子视图view就能计算出其在屏幕中的位置,也就能滑动到指定的位置。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值