Android RecyclerView滾動定位
概述
RecyclerView在安卓開發(fā)中非常實用,而且簡單易用,但是在實際開發(fā)中一直有一個問題困擾著我,就是定位問題,實際的項目中總是會遇到這樣的需求:檢索RecyclerView的某一項(各個項的高度不確定),然后定位這一項,將它顯示在頂部。用RecyclerView的默認移動的方法并不能實現(xiàn)這一點(個人感覺官方可能出于性能考慮才不實現(xiàn)這一點)。這篇博客就講解下我個人是如何實現(xiàn)這個需求的。
Demo演示

敲代碼前的思考
RecyclerView提供的用于控制移動的方法有2個
- scrollToPosition(int)
這個方法的作用是顯示指定項,就是把你想置頂?shù)捻楋@示出來,但是在屏幕的什么位置是不管的,只要那一項現(xiàn)在看得到了,那它就罷工了!
- scrollBy(int x,int y)
這個方法是自己去控制移動的距離,單位應(yīng)該是像素。
使用scrollToPosition時,移動到前面的項時,它默認會將要顯示的項置頂,但是移動到后面的項時,位置就說不好了(看它心情?。┮话銜@示在最后一個。用過的應(yīng)該都有所了解。
使用scrollBy時就需要自己計算高度或者寬度。在動態(tài)的布局中且各項樣式高度可能都不一樣的情況下,自己計算高度是很有難度的。
上面說了這么多廢話,結(jié)論就是這2個方法都不能很好解決問題,但是,當他們2個結(jié)合使用的時候,我們的問題就變的好解決很多了!
思路是:先用scrollToPosition,將要置頂?shù)捻椣纫苿语@示出來,然后計算這一項離頂部的距離,用scrollBy完成最后的100米!
關(guān)鍵代碼
先傳入要置頂?shù)趲醉?,然后區(qū)分情況處理
private void moveToPosition(int n) {
//先從RecyclerView的LayoutManager中獲取第一項和最后一項的Position
int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition();
int lastItem = mLinearLayoutManager.findLastVisibleItemPosition();
//然后區(qū)分情況
if (n <= firstItem ){
//當要置頂?shù)捻椩诋斍帮@示的第一個項的前面時
mRecyclerView.scrollToPosition(n);
}else if ( n <= lastItem ){
//當要置頂?shù)捻椧呀?jīng)在屏幕上顯示時
int top = mRecyclerView.getChildAt(n - firstItem).getTop();
mRecyclerView.scrollBy(0, top);
}else{
//當要置頂?shù)捻椩诋斍帮@示的最后一項的后面時
mRecyclerView.scrollToPosition(n);
//這里這個變量是用在RecyclerView滾動監(jiān)聽里面的
move = true;
}
}
RecyclerView滾動監(jiān)聽
class RecyclerViewListener extends RecyclerView.OnScrollListener{
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//在這里進行第二次滾動(最后的100米!)
if (move ){
move = false;
//獲取要置頂?shù)捻椩诋斍捌聊坏奈恢?,mIndex是記錄的要置頂項在RecyclerView中的位置
int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition();
if ( 0 <= n && n < mRecyclerView.getChildCount()){
//獲取要置頂?shù)捻楉敳侩xRecyclerView頂部的距離
int top = mRecyclerView.getChildAt(n).getTop();
//最后的移動
mRecyclerView.scrollBy(0, top);
}
}
}
}
Demo下載
[CSDN]:http://xiazai.jb51.net/201701/yuanma/RecyclerViewLocation(jb51.net).rar
[GitHub]:https://github.com/tyzlmjj/AndroidUI/tree/master/RecyclerViewLocation
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- RecyclerView實現(xiàn)抖音縱向滾動ViewPager效果
- Android 基于RecyclerView實現(xiàn)的歌詞滾動自定義控件
- Android RecyclerView 滾動到中間位置的方法示例
- 淺談Android RecyclerView UI的滾動控件示例
- Android RecyclerView 實現(xiàn)快速滾動的示例代碼
- 功能強大的Android滾動控件RecyclerView
- Android使用Recyclerview實現(xiàn)圖片水平自動循環(huán)滾動效果
- XRecyclerView實現(xiàn)下拉刷新、滾動到底部加載更多等功能
- Android_RecyclerView實現(xiàn)上下滾動廣告條實例(帶圖片)
- Android中RecyclerView實現(xiàn)分頁滾動的方法詳解
- Android使用RecyclerView實現(xiàn)水平滾動控件
- Android代碼實現(xiàn)AdapterViews和RecyclerView無限滾動
- RecyclerView實現(xiàn)縱向和橫向滾動
相關(guān)文章
詳解Android ContentProvider的基本原理和使用
ContentProvider(內(nèi)容提供者)是 Android 的四大組件之一,管理 Android 以結(jié)構(gòu)化方式存放的數(shù)據(jù),以相對安全的方式封裝數(shù)據(jù)(表)并且提供簡易的處理機制和統(tǒng)一的訪問接口供其他程序調(diào)用2021-06-06
Android消息通知Notification常用方法(發(fā)送消息和接收消息)
最近在做消息通知類Notification的相關(guān)業(yè)務(wù),利用閑暇時間總結(jié)一下,主要分為兩部分來記錄:發(fā)送消息和接收消息,對Android消息通知相關(guān)知識感興趣的朋友一起看看吧2024-02-02
Android開發(fā)筆記之:Log圖文詳解(Log.v,Log.d,Log.i,Log.w,Log.e)
本篇文章是對Android中的Log進行了詳細的分析介紹,需要的朋友參考下2013-05-05

