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

首頁 > 系統 > Android > 正文

android中RecycleView添加下滑到底部的監聽示例

2019-12-12 03:16:49
字體:
來源:轉載
供稿:網友

我們的日常開發中經常用到下拉刷新,而網上評價最好的開源下拉刷新組件當然還是android-Ultra-Pull-To-Refresh 此組件可以給任何的控件添加下拉刷新功能。當然也包括recycleview了。

可惜android-Ultra-Pull-To-Refresh只是提供了下拉刷新的功能,但是對于列表類的組件,我們日常開發中更多的會用到其上拉加載或者滑到底部自動加載的功能,當然目前來看用戶更喜歡滑到底部自動加載的功能。就比如今天說的recycleview我們只能自己給其添加滑到底部加載更多的功能了。

那它的實現原理是神馬呢 非常簡單:

RecycleView內部有一個滑動監聽的抽象類OnScrollListener來接收滾動事件,此類里面有兩個實現的方法

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.     * <p>     * 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 當recyclerview的滾動狀態發生變化的時候調用。

onScrolled 在布局可見和recycleview滾動的時候調用。

那么思路就是:

(1)在onScrollStateChanged 方法中判斷當前的滾動狀態是停止滾動的狀態。

(2)然后根據api中的方法獲得最后可見的位置。

(3)判斷當前可見的recycleview中item的條數大于0

(4)判斷最后可見的位置大于數大于item總數減一

(5)并且item的總數大于可見的item 這樣可以保證超過一個界面的時候才執行。

當滿足讓面的要求的時候我們就可以通過接口回調執行我們的耗時邏輯 ,并顯示出加載的dialog。

因為RecyclerView可以通過layoutManager靈活的轉換成列表,表格,和瀑布流。尤其是瀑布流的時候,它的最后可見的位置是不一樣的,所以我們必須根據其不同的layoutManager狀態獲取相對應的最后可見位置。

代碼:

 @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;  }

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拜泉县| 江永县| 台中县| 安新县| 天峻县| 陈巴尔虎旗| 榆树市| 台北市| 石阡县| 西安市| 兴宁市| 阜康市| 互助| 苏尼特左旗| 巢湖市| 尖扎县| 浏阳市| 巴林右旗| 灵璧县| 凭祥市| 黎城县| 蕲春县| 道真| 乐平市| 土默特左旗| 合水县| 大港区| 临湘市| 调兵山市| 湾仔区| 凭祥市| 惠来县| 浦城县| 安远县| 千阳县| 沧州市| 龙岩市| 河曲县| 运城市| 金堂县| 禄丰县|