溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用RecyclerView進行滑動時如何指定Position

發(fā)布時間:2020-12-02 15:55:52 來源:億速云 閱讀:298 作者:Leah 欄目:移動開發(fā)

利用RecyclerView進行滑動時如何指定Position?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Question

最近在寫 SideBar 的時候遇到一個問題,當執(zhí)行 Recyclerview 的 smoothScrollToPosition(position) 的時候,Recyclerview 看上去并沒有滾動到指定位置。

Analysis

當然,這并不是方法的bug,而是 smoothScrollToPosition(position) 的執(zhí)行效果有三種情況,需要區(qū)分。

·目標position在第一個可見項之前 。

這種情況調(diào)用smoothScrollToPosition能夠平滑的滾動到指定位置,并且置頂。

·目標position在第一個可見項之后,最后一個可見項之前。

這種情況下,調(diào)用smoothScrollToPosition不會有任何效果···

·目標position在最后一個可見項之后。

這種情況調(diào)用smoothScrollToPosition會把目標項滑動到屏幕最下方···

Solution

鑒于這三種情況,我想大多數(shù)情況下都無法滿足我們的滑動要求。為了實現(xiàn) Recyclerview 把指定 item 滑動到屏幕頂端的需求,我們需要對上面三種情況分別處理。

 /** 目標項是否在最后一個可見項之后*/
 private boolean mShouldScroll;
 /** 記錄目標項位置*/
 private int mToPosition;

 /**
 * 滑動到指定位置
 * @param mRecyclerView
 * @param position
 */
 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) {
 // 如果跳轉(zhuǎn)位置在第一個可見位置之前,就smoothScrollToPosition可以直接跳轉(zhuǎn)
 mRecyclerView.smoothScrollToPosition(position);
 } else if (position <= lastItem) {
 // 跳轉(zhuǎn)位置在第一個可見項之后,最后一個可見項之前
 // smoothScrollToPosition根本不會動,此時調(diào)用smoothScrollBy來滑動到指定位置
 int movePosition = position - firstItem;
 if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
 int top = mRecyclerView.getChildAt(movePosition).getTop();
 mRecyclerView.smoothScrollBy(0, top);
 }
 }else {
 // 如果要跳轉(zhuǎn)的位置在最后可見項之后,則先調(diào)用smoothScrollToPosition將要跳轉(zhuǎn)的位置滾動到可見位置
 // 再通過onScrollStateChanged控制再次調(diào)用smoothMoveToPosition,執(zhí)行上一個判斷中的方法
 mRecyclerView.smoothScrollToPosition(position);
 mToPosition = position;
 mShouldScroll = true;
 }
 }

再通過onScrollStateChanged控制再次調(diào)用smoothMoveToPosition

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

目前這個解決方法有兩個已知的問題

1、當目標項在最后一個可見項之后的時候,由于我們先執(zhí)行smoothScrollToPosition方法,然后在OnScrollListener中執(zhí)行smoothMoveToPosition方法,在滑動的時候不夠連貫。
2、在手動滑動的時候執(zhí)行該方法,會有極小的概率滑動的位置出現(xiàn)偏差。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI