怎么在android中利RecycleView添加一個(gè)下滑功能?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、東鄉(xiāng)網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為東鄉(xiāng)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
RecycleView內(nèi)部有一個(gè)滑動(dòng)監(jiān)聽的抽象類OnScrollListener來接收滾動(dòng)事件,此類里面有兩個(gè)實(shí)現(xiàn)的方法
public abstract static class OnScrollListener { /** * Callback method to be invoked when RecyclerView's scroll state changes. * * @param recyclerView The RecyclerView whose scroll state has changed. * @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE}, * {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}. */ public void onScrollStateChanged(RecyclerView recyclerView, int newState){} /** * Callback method to be invoked when the RecyclerView has been scrolled. This will be * called after the scroll has completed. ** This callback will also be called if visible item range changes after a layout * calculation. In that case, dx and dy will be 0. * * @param recyclerView The RecyclerView which scrolled. * @param dx The amount of horizontal scroll. * @param dy The amount of vertical scroll. */ public void onScrolled(RecyclerView recyclerView, int dx, int dy){} }
通多源碼的注釋可以了解到
onScrollStateChanged 當(dāng)recyclerview的滾動(dòng)狀態(tài)發(fā)生變化的時(shí)候調(diào)用。
onScrolled 在布局可見和recycleview滾動(dòng)的時(shí)候調(diào)用。
那么思路就是:
(1)在onScrollStateChanged 方法中判斷當(dāng)前的滾動(dòng)狀態(tài)是停止?jié)L動(dòng)的狀態(tài)。
(2)然后根據(jù)api中的方法獲得最后可見的位置。
(3)判斷當(dāng)前可見的recycleview中item的條數(shù)大于0
(4)判斷最后可見的位置大于數(shù)大于item總數(shù)減一
(5)并且item的總數(shù)大于可見的item 這樣可以保證超過一個(gè)界面的時(shí)候才執(zhí)行。
當(dāng)滿足讓面的要求的時(shí)候我們就可以通過接口回調(diào)執(zhí)行我們的耗時(shí)邏輯 ,并顯示出加載的dialog。
因?yàn)镽ecyclerView可以通過layoutManager靈活的轉(zhuǎn)換成列表,表格,和瀑布流。尤其是瀑布流的時(shí)候,它的最后可見的位置是不一樣的,所以我們必須根據(jù)其不同的layoutManager狀態(tài)獲取相對(duì)應(yīng)的最后可見位置。
代碼:
@Override public void onScrollStateChanged(int state) { if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null) { LayoutManager layoutManager = getLayoutManager(); int lastVisibleItemPosition; if (layoutManager instanceof GridLayoutManager) { lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { int[] into = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()]; ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(into); lastVisibleItemPosition = findMax(into); } else { lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); } if (layoutManager.getChildCount() > 0 && lastVisibleItemPosition >= layoutManager.getItemCount() - 1 && layoutManager.getItemCount() > layoutManager.getChildCount()) { View footView = mFootViews.get(0); footView.setVisibility(View.VISIBLE); mLoadingListener.onLoadMore(); } } }
我們可以通過api獲取瀑布流的所有的列 ,通過下面的方法找出最下面的一列。將加載的dialog顯示在此列的下面。
private int findMax(int[] lastPositions) { int max = lastPositions[0]; for (int value : lastPositions) { if (value > max) { max = value; } } return max; }
關(guān)于怎么在android中利RecycleView添加一個(gè)下滑功能問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。