Android RecyclerView滾動(dòng)定位
概述
RecyclerView在安卓開(kāi)發(fā)中非常實(shí)用,而且簡(jiǎn)單易用,但是在實(shí)際開(kāi)發(fā)中一直有一個(gè)問(wèn)題困擾著我,就是定位問(wèn)題,實(shí)際的項(xiàng)目中總是會(huì)遇到這樣的需求:檢索RecyclerView的某一項(xiàng)(各個(gè)項(xiàng)的高度不確定),然后定位這一項(xiàng),將它顯示在頂部。用RecyclerView的默認(rèn)移動(dòng)的方法并不能實(shí)現(xiàn)這一點(diǎn)(個(gè)人感覺(jué)官方可能出于性能考慮才不實(shí)現(xiàn)這一點(diǎn))。這篇博客就講解下我個(gè)人是如何實(shí)現(xiàn)這個(gè)需求的。
Demo演示
敲代碼前的思考
RecyclerView提供的用于控制移動(dòng)的方法有2個(gè)
- scrollToPosition(int)
這個(gè)方法的作用是顯示指定項(xiàng),就是把你想置頂?shù)捻?xiàng)顯示出來(lái),但是在屏幕的什么位置是不管的,只要那一項(xiàng)現(xiàn)在看得到了,那它就罷工了!
- scrollBy(int x,int y)
這個(gè)方法是自己去控制移動(dòng)的距離,單位應(yīng)該是像素。
使用scrollToPosition時(shí),移動(dòng)到前面的項(xiàng)時(shí),它默認(rèn)會(huì)將要顯示的項(xiàng)置頂,但是移動(dòng)到后面的項(xiàng)時(shí),位置就說(shuō)不好了(看它心情!)一般會(huì)顯示在最后一個(gè)。用過(guò)的應(yīng)該都有所了解。
使用scrollBy時(shí)就需要自己計(jì)算高度或者寬度。在動(dòng)態(tài)的布局中且各項(xiàng)樣式高度可能都不一樣的情況下,自己計(jì)算高度是很有難度的。
上面說(shuō)了這么多廢話,結(jié)論就是這2個(gè)方法都不能很好解決問(wèn)題,但是,當(dāng)他們2個(gè)結(jié)合使用的時(shí)候,我們的問(wèn)題就變的好解決很多了!
思路是:先用scrollToPosition,將要置頂?shù)捻?xiàng)先移動(dòng)顯示出來(lái),然后計(jì)算這一項(xiàng)離頂部的距離,用scrollBy完成最后的100米!
關(guān)鍵代碼
先傳入要置頂?shù)趲醉?xiàng),然后區(qū)分情況處理
private void moveToPosition(int n) { //先從RecyclerView的LayoutManager中獲取第一項(xiàng)和最后一項(xiàng)的Position int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition(); int lastItem = mLinearLayoutManager.findLastVisibleItemPosition(); //然后區(qū)分情況 if (n <= firstItem ){ //當(dāng)要置頂?shù)捻?xiàng)在當(dāng)前顯示的第一個(gè)項(xiàng)的前面時(shí) mRecyclerView.scrollToPosition(n); }else if ( n <= lastItem ){ //當(dāng)要置頂?shù)捻?xiàng)已經(jīng)在屏幕上顯示時(shí) int top = mRecyclerView.getChildAt(n - firstItem).getTop(); mRecyclerView.scrollBy(0, top); }else{ //當(dāng)要置頂?shù)捻?xiàng)在當(dāng)前顯示的最后一項(xiàng)的后面時(shí) mRecyclerView.scrollToPosition(n); //這里這個(gè)變量是用在RecyclerView滾動(dòng)監(jiān)聽(tīng)里面的 move = true; } }
RecyclerView滾動(dòng)監(jiān)聽(tīng)
class RecyclerViewListener extends RecyclerView.OnScrollListener{ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //在這里進(jìn)行第二次滾動(dòng)(最后的100米?。? if (move ){ move = false; //獲取要置頂?shù)捻?xiàng)在當(dāng)前屏幕的位置,mIndex是記錄的要置頂項(xiàng)在RecyclerView中的位置 int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition(); if ( 0 <= n && n < mRecyclerView.getChildCount()){ //獲取要置頂?shù)捻?xiàng)頂部離RecyclerView頂部的距離 int top = mRecyclerView.getChildAt(n).getTop(); //最后的移動(dòng) 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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- RecyclerView實(shí)現(xiàn)抖音縱向滾動(dòng)ViewPager效果
- Android 基于RecyclerView實(shí)現(xiàn)的歌詞滾動(dòng)自定義控件
- Android RecyclerView 滾動(dòng)到中間位置的方法示例
- 淺談Android RecyclerView UI的滾動(dòng)控件示例
- Android RecyclerView 實(shí)現(xiàn)快速滾動(dòng)的示例代碼
- 功能強(qiáng)大的Android滾動(dòng)控件RecyclerView
- Android使用Recyclerview實(shí)現(xiàn)圖片水平自動(dòng)循環(huán)滾動(dòng)效果
- XRecyclerView實(shí)現(xiàn)下拉刷新、滾動(dòng)到底部加載更多等功能
- Android_RecyclerView實(shí)現(xiàn)上下滾動(dòng)廣告條實(shí)例(帶圖片)
- Android中RecyclerView實(shí)現(xiàn)分頁(yè)滾動(dòng)的方法詳解
- Android使用RecyclerView實(shí)現(xiàn)水平滾動(dòng)控件
- Android代碼實(shí)現(xiàn)AdapterViews和RecyclerView無(wú)限滾動(dòng)
- RecyclerView實(shí)現(xiàn)縱向和橫向滾動(dòng)
相關(guān)文章
Android異步加載數(shù)據(jù)和圖片的保存思路詳解
這篇文章主要介紹了Android異步加載數(shù)據(jù)和圖片的保存思路詳解的相關(guān)資料,需要的朋友可以參考下2016-04-04JetPack Compose底部導(dǎo)航欄的實(shí)現(xiàn)方法詳解
開(kāi)發(fā)一個(gè)新項(xiàng)目,底部導(dǎo)航欄一般是首頁(yè)的標(biāo)配,在以前的xml布局中,我們可以很輕松的是用谷歌提供的BottomNavigationView或者自定義來(lái)實(shí)現(xiàn)底部導(dǎo)航的功能,在Compose中也有也提供了一個(gè)類(lèi)似的控件androidx.compose.material.BottomNavigation2022-09-09Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào))
本篇文章主要介紹了Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào)),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Flutter利用注解生成可自定義的路由的實(shí)現(xiàn)
這篇文章主要介紹了Flutter利用注解生成可自定義的路由的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Android實(shí)現(xiàn)ListView異步加載的方法(改進(jìn)版)
這篇文章主要介紹了Android實(shí)現(xiàn)ListView異步加載的方法,針對(duì)前面介紹的方法進(jìn)行了線程操作的改進(jìn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08Android模仿用戶(hù)設(shè)置密碼實(shí)例
首先有2個(gè)對(duì)話框,沒(méi)有設(shè)置過(guò)密碼,需要設(shè)置dialog_set_password.xml,用戶(hù)設(shè)置過(guò)密碼,不需要設(shè)置,直接輸入密碼dialog_input_password.xml,具體實(shí)現(xiàn)代碼,大家參考下本文2017-03-03Android獲取周?chē)鶺IFI熱點(diǎn)服務(wù)
這篇文章主要為大家詳細(xì)介紹了Android獲取周?chē)鶺IFI熱點(diǎn)服務(wù)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Android?Studio實(shí)現(xiàn)購(gòu)買(mǎi)售賣(mài)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)購(gòu)買(mǎi)售賣(mài)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Android 實(shí)現(xiàn)仿支付寶的密碼均分輸入框
這篇文章主要介紹了Android 實(shí)現(xiàn)仿支付寶的密碼均分輸入框的相關(guān)資料,需要的朋友可以參考下2017-06-06Android自定義View實(shí)現(xiàn)公交成軌跡圖
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)公交成軌跡圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06