1. 程式人生 > >RecyclerView自身帶的滾動事件(平滑的移動到特定的Position位置顯示)

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);