国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android RecyclerView滾動定位

2019-12-12 03:54:27
字體:
來源:轉載
供稿:網友

概述
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.VeVB.COm/201701/yuanma/RecyclerViewLocation(VeVB.COm).rar

[GitHub]:https://github.com/tyzlmjj/AndroidUI/tree/master/RecyclerViewLocation

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌图县| 贵州省| 太康县| 鞍山市| 应用必备| 政和县| 昌宁县| 赤水市| 麻栗坡县| 金川县| 盐源县| 页游| 明溪县| 易门县| 太湖县| 芜湖市| 达拉特旗| 墨玉县| 托里县| 台南县| 石嘴山市| 蓝田县| 新田县| 左云县| 田林县| 阿尔山市| 张家港市| 集贤县| 林周县| 海兴县| 同心县| 乐山市| 元阳县| 罗平县| 霍邱县| 鄂温| 新巴尔虎右旗| 丹棱县| 葵青区| 南陵县| 泸州市|