我们在开发过程中使用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就能计算出其在屏幕中的位置,也就能滑动到指定的位置。