1. 程式人生 > >自己封裝的工具類,使用原生SwipeRefreshLayout+RecycleView實現下拉重新整理和載入更多

自己封裝的工具類,使用原生SwipeRefreshLayout+RecycleView實現下拉重新整理和載入更多

實現SwipeRefreshLayout+RecycleView實現重新整理

在你的xml檔案裡寫上如下程式碼:

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/SwipeRefreshLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recyclerView"
android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="#00000000" android:overScrollMode="never" android:scrollbars="none"/> </android.support.v4.widget.SwipeRefreshLayout>

在你的Activity或Fragment實現RecyclerViewLoadMoreUtil.RefreshDataListener重新整理介面並呼叫以下程式碼初始化:

這裡的init()方法中的
引數一:content
引數二:SwipeRefreshLayout控制元件
引數三:RecyclerView控制元件
引數四:繼承RecyclerView.Adapter的adapter,這裡可以使用我另外寫的一篇關於adapter的封裝
引數五:重新整理介面,這裡如果在Activity或Fragment實現RecyclerViewLoadMoreUtil.RefreshDataListener就可以在此處填this了

        recyclerViewLoadMoreUtil = new RecyclerViewLoadMoreUtil();
        recyclerViewLoadMoreUtil.init(mContext, mSwipeRefreshLayout, mRecyclerView, mAdapter, this);
        recyclerViewLoadMoreUtil.setColorSchemeResources(R.color.yellow_press, R.color.green, R.color.red);
        recyclerViewLoadMoreUtil.autoRefreshing();//第一次自動載入一次
        ....
 @Override
    public void onRefresh() {
        recyclerViewLoadMoreUtil.endRefreshing();
        //Do the things you want to do
    }    
 @Override
    public boolean loadMore() {
        recyclerViewLoadMoreUtil.endLoading();
        //Do the things you want to do
        return true;
    }

下面介紹該工具類中的幾個方法

  • autoRefreshing(); // 自動載入上拉重新整理
  • endRefreshing();// 關閉SwipeRefreshLayout的小圓圈
  • endLoading();// 關閉載入更多
  • setPullDownRefreshEnable(boolean isRefresh);// 設定列表是否禁止下拉重新整理,是否顯示下拉重新整理動畫只能通過該方法設定
  • setPullUpRefreshEnable(boolean isLoadMore);// 設定列表是否禁止上拉重新整理

以下是該重新整理工具類的全部程式碼

/**
 * Created by xiongxuesong-pc on 2016/6/17.
 * 配合原生RecyclerVew和SwipeRefreshLayout載入更多
 */
public class RecyclerViewLoadMoreUtil {
    protected Context mContext;
    protected SwipeRefreshLayout mSwipeRefreshLayout;
    protected RecyclerView mRecyclerView;
    protected RecyclerView.Adapter mAdapter;
    protected RefreshDataListener mRefreshDataListener;
    private boolean mIsRefresh = true;//是否禁止下拉重新整理,預設是不禁止下拉重新整理
    private boolean mIsLoadMore = true;//是否禁止上拉重新整理,預設是不禁止上拉重新整理
    private boolean isSlidingToScreenBottom = false;//用來標記是否正在向最後一個滑動,既是否向右滑動或向下滑動

    public RecyclerViewLoadMoreUtil() {

    }

    public void init(final Context context, final SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, final RecyclerView.Adapter adapter, final RefreshDataListener refreshDataListener) {
        initConfig(context, swipeRefreshLayout, recyclerView, adapter, refreshDataListener);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                boolean isRefreshing = swipeRefreshLayout.isRefreshing();
                if (isRefreshing) {
                    refreshDataListener.onRefresh();
                }
            }
        });

        final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
                // 當不滾動時
                boolean idleFlag = newState == RecyclerView.SCROLL_STATE_IDLE;
                if (idleFlag) {
                    //獲取最後一個完全顯示的ItemPosition
                    int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
                    int totalItemCount = mAdapter.getItemCount();

                    // 判斷是否滾動到螢幕底部,並且是向右滾動
                    if (lastVisibleItem == (totalItemCount - 1) && isSlidingToScreenBottom) {
                        if (mScrolledBottomListener != null) {
                            mScrolledBottomListener.ScrolledBottom(recyclerView);
                        }

                        if (mIsLoadMore) {//可以載入更多
                            mSwipeRefreshLayout.setEnabled(false);//禁止使用下拉重新整理
                            mRefreshDataListener.loadMore();
                            Log.d("TAG", "howes right=" + manager.findLastCompletelyVisibleItemPosition());
//                                Toast.makeText(mContext, "載入更多", Toast.LENGTH_SHORT).show();
                        } else {
//                            Toast.makeText(mContext, "不能載入更多", Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                Log.d("TAG", "dy=" + dy);
                //dx用來判斷橫向滑動方向,dy用來判斷縱向滑動方向
                //當列表項的總高度小於螢幕,即不會滾動列表時,dx、dy都等於0
                if (dy > 0) {
                    //大於0表示,正在向右滾動,向上滾動
                    isSlidingToScreenBottom = true;
                } else {
                    //小於等於0 表示停止或向左滾動,向下滾動
                    isSlidingToScreenBottom = false;
                }
                if (mScrollingListener != null) {
                    mScrollingListener.scroll(isSlidingToScreenBottom);
                }
            }
        });
    }

    private void initConfig(Context context, SwipeRefreshLayout swipeRefreshLayout, RecyclerView recyclerView, RecyclerView.Adapter adapter, RefreshDataListener refreshDataListener) {
        this.mContext = context;
        this.mSwipeRefreshLayout = swipeRefreshLayout;
        this.mRecyclerView = recyclerView;
        this.mAdapter = adapter;
        this.mRefreshDataListener = refreshDataListener;
    }

    /**
     * 首次進入頁面可以自動載入,要使用必須在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
     * 之後呼叫
     */
    public void autoRefreshing() {
        mSwipeRefreshLayout.post(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(true);
                mRefreshDataListener.onRefresh();
            }
        });
    }

    /**
     * 要使用必須在{@link #init(Context, SwipeRefreshLayout, RecyclerView, RecyclerView.Adapter, RefreshDataListener)}
     * 之後呼叫
     *
     * @param colorResIds
     */
    public void setColorSchemeResources(@ColorRes int... colorResIds) {
        mSwipeRefreshLayout.setColorSchemeResources(colorResIds);
    }

    public void endRefreshing() {
        mSwipeRefreshLayout.setRefreshing(false);
    }

    public void endLoading() {
        if (mIsRefresh) {//如果之前已經設定過禁止下拉重新整理,此時不應該在設定成可下拉重新整理
            setPullDownRefreshEnable(true);//可以使用下拉重新整理
        } else {//如果之前已經設定過禁止下拉重新整理,此時不應該在設定成可下拉重新整理
            setPullDownRefreshEnable(false);//不可以使用下拉重新整理
        }
    }

    /**
     * 設定列表是否禁止下拉重新整理,是否顯示下拉重新整理動畫只能通過該方法設定
     *
     * @param isRefresh true 可以使用下拉重新整理;false 不可以使用下拉重新整理
     */
    public void setPullDownRefreshEnable(boolean isRefresh) {
        mIsRefresh = isRefresh;
        mSwipeRefreshLayout.setEnabled(isRefresh);
    }

    /**
     * 設定列表是否禁止上拉重新整理
     *
     * @param isLoadMore true 可以使用上拉重新整理;false 不可以使用上拉重新整理
     */
    public void setPullUpRefreshEnable(boolean isLoadMore) {
        mIsLoadMore = isLoadMore;
    }

    public interface RefreshDataListener {
        void onRefresh();

        boolean loadMore();
    }

    private ScrollingListener mScrollingListener;

    public interface ScrollingListener {
        /**
         * true 向上滾動;false 向下滾動
         *
         * @param scrollState
         */
        void scroll(boolean scrollState);
    }

    public void setScrollingListener(ScrollingListener listener) {
        mScrollingListener = listener;
    }

    private ScrolledBottomListener mScrolledBottomListener;

    public interface ScrolledBottomListener {
        /**
         * 列表滾動到螢幕底部時呼叫
         *
         * @param recyclerView
         */
        void ScrolledBottom(RecyclerView recyclerView);
    }

    public void setScrollingListener(ScrolledBottomListener listener) {
        mScrolledBottomListener = listener;
    }

}

這是本人從專案中抽取出來的,暫時沒在專案中出現問題,希望能幫助到你。

轉載請註明出處,謝謝!

相關推薦

自己封裝工具使用原生SwipeRefreshLayout+RecycleView實現重新整理載入

實現SwipeRefreshLayout+RecycleView實現重新整理 在你的xml檔案裡寫上如下程式碼: <android.support.v4.widget.SwipeRefreshLayout

輕鬆實現RecycleView重新整理載入

那如同這個題目,這裡面涉及的東西其實還是比較多的,RecycleView SwipeRefreshLayout,下拉重新整理(這個就是SwipeRefreshLayout的),載入更多。 SwipeRefreshLayout 這個是Google自己封

PullToRefreshView重新整理上來載入支援任何子view!

最新自己寫了一個PullToRefreshView,這是一個自定義view,繼承於LinearLayout,子控制元件可以是任意控制元件!先上一張福利圖: 由於PullToRefreshView繼承於LinearLayout,它有著ViewGroup的特性,子控制元件可以

SwipeRefreshLayout+RecyclerView實現重新整理載入功能

Android Studio 的gradle中新增如下依賴,SwipeRefreshLayout在 support V4 包下,RecyclerView在V7包下,由於V7包內包涵了V4,所以就不需要新增V4的依賴了。 compile 'com.and

通過ViewGroup實現重新整理載入2018/2/12 06

為了重新瞭解一下自定義ViewGroup,自己實現了一個下拉重新整理view,衝突的解決Recyclerview滾動到底部和頂部的處理全部放在了父view 中,滾動實現使用的是Scroller,所以使整個控制元件還有類似ios的彈性效果,程式碼很簡單,使用也很簡

SwipeRefreshLayout 配合fragment 重新整理的使用超級簡單

前臺demo <android.support.v4.widget.SwipeRefreshLayout         android:layout_width="match_parent"         android:id="@+id/swipe_contai

解讀Google官方SwipeRefreshLayout控制元件原始碼帶你揭祕Android重新整理實現原理

前言 想必大家也發現,時下的很多App都應用了這個Google出品的SwipeRefreshLayout下拉重新整理控制元件,它以Material Design風格、適用場景廣泛,簡單易用等特性而獨步江湖。但在我們使用的過程中,不可避免地會發現一些bug,或者

XRecyclerView實現RecyclerView重新整理上來載入 自己做了部分修改使程式碼簡潔易用

首先感謝 開源作者 /** * Created by jianghejie on 15/11/26. */ 的無私奉獻  我是在他的基礎上做的修改 以前一直是用的XListView   可是 測試發現有一個奇奇怪怪的BUG,我們還無法解決。最嚴重的是 XListV

基於React Native官方元件FlatList增加可定製化“重新整理”、“載入”元件API的新列表元件react-native-refresh-loadmore-flatlist

react-native-refresh-loadmore-flatlist 基於React Native官方元件FlatList,增加可定製化“下拉重新整理”、“下拉載入更多”元件API的新列表元件,具體實現功能如下: 自定義下拉重新整理元件API 自定義上拉Lo

TwinklingRefreshLayout 簡單實現實現重新整理載入

支援下拉重新整理和上拉載入的RefreshLayout,自帶越界回彈效果,支援RecyclerView,AbsListView,ScrollView,WebView 本文以ListView為例,實現上拉重新整理和下拉載入,其他的就不在舉例,原理是一樣的。 先看一下效果(效

SwipeRefreshLayout實現重新整理功能

在Android5.0的v4包中,Google提供了SwipeRefreshLayout控制元件,用來執行下拉重新整理的效果。 XML: <?xml version="1.0" encoding="utf-8"?> <android.suppo

Android LRecyclerView實現重新整理滑動到底部自動載入

                     隨著功能的不斷優化,框架中的類或者介面名字會有變動,為了獲取準確的使用方法,請參考最新的說明文件:點此檢視。簡介LRecyclerView是支援addHeaderView、 addFooterView、下拉重新整理、分頁載入資料的RecyclerView。它對 Rec

原生JS實現重新整理

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Document</title>

Flutter 實現重新整理 非安卓原生效果

先附上連線 https://github.com/dikeboy/flutter-refrensh 這裡涉及到flutter中的 幾塊   動畫 ,事件點選, 非同步, 要自定義下拉重新整理   首先必須要了解Flutter 中的事件監聽方法 https://f

實現重新整理載入可自定義各種動畫

一、使用說明 1、UltimateRefreshView 支援ListView,GridView,ScrollView,WebVIew,RecyclerView(只支援LinearLayoutManager). 2、佈局使用: 1 2 3 4 5 6 7 8 9 1

Android RecyclerView (四)總結(一)-(三)並且實現重新整理資料載入資料功能

我們使用的程式碼還是為以前文章寫的。 這一次我們主要實現的是下拉重新整理資料,和上拉載入資料,這裡我都用Thread.sleep(xxx)的方法來模擬獲取資料等待。 首先我們下拉重新整理的時候要用到: SwipeRefreshLayout 來看一下如何在

使用SwipeRefreshLayoutRecyclerView實現重新整理載入

效果圖: 檔案目錄 佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/

Android分組列表懸停顯示分組listView懸停效果重新整理載入

分組列表,帶下拉重新整理和上拉載入更多【專案地址在文章最後!!】 效果圖: 實現過程,借鑑PinnedHeadListView,但是該demo沒有下拉重新整理功能,故將該控制元件整合到PullToRefresh 庫中,【PullToRefresh 庫為第

在微信小程式中如何實現重新整理(模擬重新整理

一、在app.json中啟動重新整理, 在Windows 中,        新增  "enablePullDownRefresh":"true" 二、在需要重新整理的頁面中寫(若是單個頁面),反之,可寫入app.js中: onPullDownRefre

使用SwipeRefreshLayoutRecyclerView實現仿“簡書”重新整理載入

package com.leohan.refresh;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7