RecyclerView滑動(dòng)到指定Position的方法
Question
最近在寫 SideBar 的時(shí)候遇到一個(gè)問題,當(dāng)執(zhí)行 Recyclerview 的 smoothScrollToPosition(position) 的時(shí)候,Recyclerview 看上去并沒有滾動(dòng)到指定位置。
Analysis
當(dāng)然,這并不是方法的bug,而是 smoothScrollToPosition(position) 的執(zhí)行效果有三種情況,需要區(qū)分。
·目標(biāo)position在第一個(gè)可見項(xiàng)之前 。
這種情況調(diào)用smoothScrollToPosition能夠平滑的滾動(dòng)到指定位置,并且置頂。
·目標(biāo)position在第一個(gè)可見項(xiàng)之后,最后一個(gè)可見項(xiàng)之前。
這種情況下,調(diào)用smoothScrollToPosition不會(huì)有任何效果···
·目標(biāo)position在最后一個(gè)可見項(xiàng)之后。
這種情況調(diào)用smoothScrollToPosition會(huì)把目標(biāo)項(xiàng)滑動(dòng)到屏幕最下方···
Solution
鑒于這三種情況,我想大多數(shù)情況下都無法滿足我們的滑動(dòng)要求。為了實(shí)現(xiàn) Recyclerview 把指定 item 滑動(dòng)到屏幕頂端的需求,我們需要對(duì)上面三種情況分別處理。
/** 目標(biāo)項(xiàng)是否在最后一個(gè)可見項(xiàng)之后*/
private boolean mShouldScroll;
/** 記錄目標(biāo)項(xiàng)位置*/
private int mToPosition;
/**
* 滑動(dòng)到指定位置
* @param mRecyclerView
* @param position
*/
private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
// 第一個(gè)可見位置
int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
// 最后一個(gè)可見位置
int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));
if (position < firstItem) {
// 如果跳轉(zhuǎn)位置在第一個(gè)可見位置之前,就smoothScrollToPosition可以直接跳轉(zhuǎn)
mRecyclerView.smoothScrollToPosition(position);
} else if (position <= lastItem) {
// 跳轉(zhuǎn)位置在第一個(gè)可見項(xiàng)之后,最后一個(gè)可見項(xiàng)之前
// smoothScrollToPosition根本不會(huì)動(dòng),此時(shí)調(diào)用smoothScrollBy來滑動(dòng)到指定位置
int movePosition = position - firstItem;
if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
int top = mRecyclerView.getChildAt(movePosition).getTop();
mRecyclerView.smoothScrollBy(0, top);
}
}else {
// 如果要跳轉(zhuǎn)的位置在最后可見項(xiàng)之后,則先調(diào)用smoothScrollToPosition將要跳轉(zhuǎn)的位置滾動(dòng)到可見位置
// 再通過onScrollStateChanged控制再次調(diào)用smoothMoveToPosition,執(zhí)行上一個(gè)判斷中的方法
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);
}
}
});
}
目前這個(gè)解決方法有兩個(gè)已知的問題
1、當(dāng)目標(biāo)項(xiàng)在最后一個(gè)可見項(xiàng)之后的時(shí)候,由于我們先執(zhí)行smoothScrollToPosition方法,然后在OnScrollListener中執(zhí)行smoothMoveToPosition方法,在滑動(dòng)的時(shí)候不夠連貫。
2、在手動(dòng)滑動(dòng)的時(shí)候執(zhí)行該方法,會(huì)有極小的概率滑動(dòng)的位置出現(xiàn)偏差。
如果你有更好解決辦法,希望不吝指教。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- RecyclerView+CardView實(shí)現(xiàn)橫向卡片式滑動(dòng)效果
- Android中RecyclerView實(shí)現(xiàn)橫向滑動(dòng)代碼
- Android中RecyclerView嵌套滑動(dòng)沖突解決的代碼片段
- Android中RecyclerView 滑動(dòng)時(shí)圖片加載的優(yōu)化
- android RecyclerView側(cè)滑菜單,滑動(dòng)刪除,長(zhǎng)按拖拽,下拉刷新上拉加載
- Android實(shí)現(xiàn)評(píng)論欄隨Recyclerview滑動(dòng)左右移動(dòng)
- Android 滑動(dòng)監(jiān)聽RecyclerView線性流+左右劃刪除+上下移動(dòng)
- Android開發(fā)中RecyclerView模仿探探左右滑動(dòng)布局功能
- Android RecyclerView滑動(dòng)刪除和拖動(dòng)排序
- Android嵌套R(shí)ecyclerView左右滑動(dòng)替代自定義view
- RecyclerView實(shí)現(xiàn)探探卡片滑動(dòng)效果
相關(guān)文章
Kotlin文件讀寫與SharedPreferences存儲(chǔ)功能實(shí)現(xiàn)方法
SharedPreferences是安卓平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類,用來保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時(shí),將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時(shí),再?gòu)腟haredPreferences中將值取出2022-12-12
Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Android實(shí)現(xiàn)EditText換行自動(dòng)縮進(jìn)功能
在很多需要輸入多行文本的應(yīng)用(如記事本、編程代碼編輯器、博客編輯器等)中,自動(dòng)縮進(jìn)功能能大大提升用戶的編輯效率與體驗(yàn),本文給大家介紹了Android實(shí)現(xiàn)EditText換行自動(dòng)縮進(jìn)功能,下面提供整合后的完整代碼示例,需要的朋友可以參考下2025-04-04
Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求
這篇文章主要為大家詳細(xì)介紹了Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android開發(fā)實(shí)現(xiàn)撥打電話與發(fā)送信息的方法分析
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)撥打電話與發(fā)送信息的方法,結(jié)合實(shí)例形式分析了Android撥打電話及發(fā)送信息相關(guān)布局、功能實(shí)現(xiàn)及權(quán)限控制操作技巧,需要的朋友可以參考下2017-12-12
Android藍(lán)牙服務(wù)啟動(dòng)流程分析探索
這篇文章主要介紹了Android藍(lán)牙服務(wù)啟動(dòng)流程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的2023-01-01

