編輯:關於Android編程
概述
RecyclerView在安卓開發中非常實用,而且簡單易用,但是在實際開發中一直有一個問題困擾著我,就是定位問題,實際的項目中總是會遇到這樣的需求:檢索RecyclerView的某一項(各個項的高度不確定),然後定位這一項,將它顯示在頂部。用RecyclerView的默認移動的方法並不能實現這一點(個人感覺官方可能出於性能考慮才不實現這一點)。這篇博客就講解下我個人是如何實現這個需求的。
Demo演示
敲代碼前的思考
RecyclerView提供的用於控制移動的方法有2個
- scrollToPosition(int)
這個方法的作用是顯示指定項,就是把你想置頂的項顯示出來,但是在屏幕的什麼位置是不管的,只要那一項現在看得到了,那它就罷工了!
- scrollBy(int x,int y)
這個方法是自己去控制移動的距離,單位應該是像素。
使用scrollToPosition時,移動到前面的項時,它默認會將要顯示的項置頂,但是移動到後面的項時,位置就說不好了(看它心情!)一般會顯示在最後一個。用過的應該都有所了解。
使用scrollBy時就需要自己計算高度或者寬度。在動態的布局中且各項樣式高度可能都不一樣的情況下,自己計算高度是很有難度的。
上面說了這麼多廢話,結論就是這2個方法都不能很好解決問題,但是,當他們2個結合使用的時候,我們的問題就變的好解決很多了!
思路是:先用scrollToPosition,將要置頂的項先移動顯示出來,然後計算這一項離頂部的距離,用scrollBy完成最後的100米!
關鍵代碼
先傳入要置頂第幾項,然後區分情況處理
private void moveToPosition(int n) { //先從RecyclerView的LayoutManager中獲取第一項和最後一項的Position int firstItem = mLinearLayoutManager.findFirstVisibleItemPosition(); int lastItem = mLinearLayoutManager.findLastVisibleItemPosition(); //然後區分情況 if (n <= firstItem ){ //當要置頂的項在當前顯示的第一個項的前面時 mRecyclerView.scrollToPosition(n); }else if ( n <= lastItem ){ //當要置頂的項已經在屏幕上顯示時 int top = mRecyclerView.getChildAt(n - firstItem).getTop(); mRecyclerView.scrollBy(0, top); }else{ //當要置頂的項在當前顯示的最後一項的後面時 mRecyclerView.scrollToPosition(n); //這裡這個變量是用在RecyclerView滾動監聽裡面的 move = true; } }
RecyclerView滾動監聽
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; //獲取要置頂的項在當前屏幕的位置,mIndex是記錄的要置頂項在RecyclerView中的位置 int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition(); if ( 0 <= n && n < mRecyclerView.getChildCount()){ //獲取要置頂的項頂部離RecyclerView頂部的距離 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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
本文實例講述了Android編程實現canvas繪制餅狀統計圖功能。分享給大家供大家參考,具體如下:本例的目的是實現一個簡單的餅狀統計圖,效果如下:  
SoftAp界面開啟流程(讓你的手機支持SoftAp功能) 市面上大多數手機支持SoftAp功能,有少數手機沒有打開SoftAp的界面設置,所以無法開啟此功能(當然有些山
魅族發布了今年最後一款歷史性新品---魅藍metal,魅藍metal依舊采用了與或卡托(單卡槽雙卡位)設計,且支持雙卡雙待,目前預約的有移動定制版和公開版。
蘑菇ROM助手可以對system.img文件進行合並或分割,下面就讓我給大家講講如何操作。一、操作前准備1、下載安裝ROM助手2、准備好刷機包二、打開ROM