自己封裝的工具類,使用原生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 來看一下如何在
使用SwipeRefreshLayout和RecyclerView實現下拉重新整理上拉載入更多
效果圖: 檔案目錄 佈局檔案 <?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
使用SwipeRefreshLayout和RecyclerView實現仿“簡書”下拉重新整理和上拉載入
package com.leohan.refresh;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7