Android RecyclerView滚动到指定位置不起作用

滚动不起作用

此问题主要是获取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如果不在屏幕滚动是不起作用的。
  • 参考网络文章点击这里进入

你可能感兴趣的:(Android RecyclerView滚动到指定位置不起作用)