滚动不起作用
此问题主要是获取scrollBy滚动位置不确定,如果在屏幕之上可正常获取,如果在屏幕之外就出现无法定位问题。而屏幕之外又分为划过的位置和未绘制过的位置。
根据此问题总结解决方法如下
1. 滑动代码如下
private boolean move = false;
private int mIndex = 3;
private void moveToPosition(int index) {
this.mIndex = index;
//获取当前recycleView屏幕可见的第一项和最后一项的Position
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstItem = linearLayoutManager.findFirstVisibleItemPosition();
int lastItem = linearLayoutManager.findLastVisibleItemPosition();
//然后区分情况
if (index <= firstItem) {
//当要置顶的项在当前显示的第一个项的前面时
recyclerView.scrollToPosition(index);
move = true;
} else if (index <= lastItem) {
//当要置顶的项已经在屏幕上显示时,计算它离屏幕原点的距离
int top = recyclerView.getChildAt(index - firstItem).getTop() - toolbar.getHeight() * 2;
recyclerView.scrollBy(0, top);
} else {
//当要置顶的项在当前显示的最后一项的后面时
recyclerView.scrollToPosition(index);
//记录当前需要在RecyclerView滚动监听里面继续第二次滚动
move = true;
}
}
- 其中,toolbar.getHeight() * 2为上部toolbar和filterview位置,需要空出来
- 二次滚动会在RecyclerView的onScroll方法进行
2. 二次滚动代码如下
//在这里进行第二次滚动(最后的距离)
if (move) {
move = false;
//获取要置顶的项在当前屏幕的位置,mIndex是记录的要置顶项在RecyclerView中的位置
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int n = mIndex - linearLayoutManager.findFirstVisibleItemPosition();
if (0 <= n && n < recyclerView.getChildCount()) {
//获取要置顶的项顶部离RecyclerView顶部的距离
int top = recyclerView.getChildAt(n).getTop() - toolbar.getHeight() * 2;
//最后的移动
recyclerView.scrollBy(0, top);
} else if (n < 0) {
linearLayoutManager.scrollToPositionWithOffset(mIndex, toolbar.getHeight() * 2);
}
}
- 在RecyclerView的addOnScrollListener监听中,onScrolled回调方法加上此段代码,进行二次滚动,完美解决。
- 其中linearLayoutManager.scrollToPositionWithOffset()滚动解决不在屏幕的item滚动位置问题
- 已验证scrollToPosition如果不在屏幕滚动是不起作用的。
- 参考网络文章点击这里进入
网友评论