在我們很多項(xiàng)目中宪拥,一般列表頁(yè)面的展示都用到了ListView或者是RecyclerView(其實(shí)一般現(xiàn)在的APP主頁(yè)都是用RecyclerView了,它能完美的實(shí)現(xiàn)多布局)绵估,那么有時(shí)候會(huì)有滑到指定位置的需求屏富,最常見(jiàn)的需求就是回到頂部操作。今天就給大家簡(jiǎn)單的介紹一下娄琉,如何用recyclerview實(shí)現(xiàn)這種操作次乓,有的人就會(huì)提出,recyclerview自己就提供了方法能為我們實(shí)現(xiàn)孽水,recycle.smoothScrollToPosition(position)這個(gè)方法就能實(shí)現(xiàn)票腰,其實(shí)不然,這里邊有個(gè)不大不小的坑女气,且聽(tīng)我為大家慢慢道來(lái)杏慰。
recycle.smoothScrollToPosition(position)這個(gè)方法是能自動(dòng)滑動(dòng)到指定位置(即position),因?yàn)樗瞧交幕瑒?dòng)過(guò)去的炼鞠,不會(huì)給用戶一種突兀的感覺(jué)缘滥,所以大家都愛(ài)用。
在我們使用過(guò)程中谒主,只要傳入想要滑動(dòng)到的位置就可以了朝扼。但是在實(shí)際中,如果我們傳入的position是大于屏幕中第一個(gè)可見(jiàn)的itemView位置時(shí)霎肯,也就是從上往下滑動(dòng)的時(shí)候擎颖,我們發(fā)現(xiàn)他只能將我們想要的View展示在屏幕最底部,但是我們想要的效果往往是將其滑動(dòng)到頂部观游。所以我們需要進(jìn)行判斷搂捧,當(dāng)想滑動(dòng)到位置position(下文position都代表想要滑到的位置)小于當(dāng)前第一個(gè)可見(jiàn)itemView時(shí)候,我們直接調(diào)用recycle.smoothScrollToPosition(position)方法懂缕,這是沒(méi)有問(wèn)題的允跑,但是當(dāng)其大于的時(shí)候,我們就需要對(duì)其進(jìn)行處理搪柑。我們先調(diào)用recycle.smoothScrollToPosition(position)方法聋丝,現(xiàn)將想要滑動(dòng)到的位置給顯示出來(lái),然后再計(jì)算它離頂部還有多少距離工碾,然后調(diào)用recycle.smoothScrollBy(0,top)這個(gè)方法使其滑動(dòng)到想要的位置潮针,那么到底是如何操作的呢?直接上代碼:
int firstItem=grid.findFirstVisibleItemPosition();
if(50<firstItem){
recycle.smoothScrollToPosition(50);//直接調(diào)用沒(méi)有任何問(wèn)題
}else{
recycle.smoothScrollToPosition(50);
readyMove=true;//是否準(zhǔn)備好二次滑動(dòng)
moving=true;//是否處于滑動(dòng)狀態(tài)
}
倚喂,上面的代碼中我們進(jìn)行了判斷,但是我們能夠看到在大于的時(shí)候瓣戚,我們也是直接調(diào)用了該方法端圈,并且將兩個(gè)標(biāo)識(shí)符都設(shè)置成了true,接下還有處理子库,還是直接上代碼:
recycle.addOnScrollListener(newRecyclerView.OnScrollListener() {
@Override
public voidonScrollStateChanged(RecyclerView recyclerView, intnewState) {
super.onScrollStateChanged(recyclerView,newState);
if(newState==RecyclerView.SCROLL_STATE_IDLE){
moving=false;
}
if(moving==false&&readyMove==true){
int firstItem=grid.findFirstVisibleItemPosition();
int top =recycle.getChildAt(50- firstItem).getTop();
recycle.smoothScrollBy(0,top);
moving=true;
readyMove=false;
}
}
@Override
public voidonScrolled(RecyclerView recyclerView, intdx, intdy) {
super.onScrolled(recyclerView,dx,dy);
}
});
上邊我們可以看到舱权,在recyclerview的滑動(dòng)監(jiān)聽(tīng)中,我們也進(jìn)行了處理仑嗅,只有在第一次滑動(dòng)完了并且好準(zhǔn)備好第二次滑動(dòng)后宴倍,我們才開(kāi)始進(jìn)行第二次滑動(dòng)张症,首先先計(jì)算離頂部的高度,
int firstItem=grid.findFirstVisibleItemPosition();
int top =recycle.getChildAt(50- firstItem).getTop();
其實(shí)recycle.getChildAt(position)這個(gè)方法也有坑的鸵贬,當(dāng)傳入position大于屏幕顯示itemView的最大數(shù)量的時(shí)候這個(gè)方法會(huì)報(bào)空指針異常俗他,所以我們?cè)谑褂玫臅r(shí)候需要將position減去firstItem,這樣才能避免爆出空指針錯(cuò)誤阔逼。
這樣我們就實(shí)現(xiàn)recyclerview滑到指定位置的功能啦~
第一次自己寫(xiě)文章兆衅,文中有不對(duì)的地方歡迎大家指正,有更好的解決辦法也歡迎討論嗜浮,希望大家能共同進(jìn)步羡亩!