RecyclerView自身带的滚动事件(平滑的移动到特定的Position位置显示)

关于滚动事件RecyclerView给我们提供了两个方法:
方法一:
  直接调用;
 mRecycleview.scrollToPosition(position);

  是可以实现直接显示到当前你要显示的position的位置的 但是给我的体验是并没有移动的那种效果所以我搜索了一下网络查看到还有另一种方法可以实现接下来带大家看一下,

 方法二:

mRecycleview.smoothScrollToPosition(position) 调用这个方法可以实现平滑的移动到当前的位置上下面我来具体的介绍一下这个逻辑实现。

一般我们用 mRecycleview.smoothScrollToPosition(0)滑动到顶部(或最后),具有滚动效果,但是如果我们想滚动到任意指定位置,那么smoothScrollToPosition()就不能保证所指定item位于屏幕顶部,那么一下提供下我解决的方法:
首先获取第一个可见位置和最后一个可见位置,分三种情况:

1.如果如果跳转位置在第一个可见位置之前,就smoothScrollToPosition()可以直接跳转; 
2.如果跳转位置在第一个可见项之后,最后一个可见项之前smoothScrollToPosition()不会滚动,此时调用smoothScrollBy来滑动到指定位置; 
3.如果要跳转的位置在最后可见项之后,则先调用smoothScrollToPosition()将要跳转的位置滚动到可见位置,在addOnScrollListener()里通过onScrollStateChanged控制,调用smoothMoveToPosition,再次执行判断;

//目标项是否在最后一个可见项之后
private boolean mShouldScroll;
//记录目标项位置
private int mToPosition;
/**
 * 滑动到指定位置
 */
private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
    // 第一个可见位置
    int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
    // 最后一个可见位置
    int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
    if (position < firstItem) {
        // 第一种可能:跳转位置在第一个可见位置之前
        mRecyclerView.smoothScrollToPosition(position);
    } else if (position <= lastItem) {
        // 第二种可能:跳转位置在第一个可见位置之后
        int movePosition = position - firstItem;
        if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
            int top = mRecyclerView.getChildAt(movePosition).getTop();
            mRecyclerView.smoothScrollBy(0, top);
        }
    } else {
        // 第三种可能:跳转位置在最后可见项之后
        mRecyclerView.smoothScrollToPosition(position);
        mToPosition = position;
        mShouldScroll = true;
    }
}

/**

给RecyclerView 添加滑动监听事件

*/

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (mShouldScroll&& RecyclerView.SCROLL_STATE_IDLE == newState) { mShouldScroll = false; smoothMoveToPosition(recyclerView, mToPosition); } } });

最后我们在调用的时候:

if (position != -1) {
                    smoothMoveToPosition(mRecyclerView,position);
                }else {
                    smoothMoveToPosition(mRecyclerView,position+1);
                }

注:也可以直接采用三元运算符来调用

smoothMoveToPosition(mRecyclerView,position>=0?position:0);

猜你喜欢

转载自blog.csdn.net/a2250742657/article/details/84940812