自己封裝的工具類,使用原生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; } }

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

轉載請注明出處,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM