概述
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; } }
網(wǎng)站標(biāo)題:AndroidRecyclerView滾動(dòng)定位-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://m.newbst.com/article0/djhhio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制網(wǎng)站、Google、網(wǎng)站建設(shè)、服務(wù)器托管、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容