基于ListView和SwipeRefreshLayout的刷新加載(樓主親測好使)
先看效果:
aada.gif
介紹使用方法:
用了谷歌的SwipeRefreshLayout作為刷新控件:
xml配置:
1 (2).png
使用方法:
使用這個刷新加載需要注意 3點卿城;
1悲立、RefreshAndload new的時候募逞,需要放在listview.setAdapter后面
2肢专、當(dāng)網(wǎng)絡(luò)請求數(shù)據(jù)诞仓,返回后,需要停止加載欄的狀態(tài)【//停止刷新加載 refreshAndload.stopRefreshAndLoad();】
3逊移、當(dāng)你的fragment和activity退出時逻翁,請盡量 調(diào)用RefreshAndLoad這個類的【onDestroy();方法】
![W]8ZTBZL9@540HLY05D7F~W.png](http://upload-images.jianshu.io/upload_images/3066171-62e44cfa4ec3c450.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下面就是 RefreshAndLoad 類的代碼
/**
* 刷新加載
* Created by xz on 2016/10/24 0024.
* 此類通過SwipeRefreshLayout,和listview的head氧急,實現(xiàn)了刷新和加載颗胡;
* 此類實現(xiàn)了listview的拉動監(jiān)聽,如果你需要用到listview的拉動監(jiān)聽吩坝,請使用本類中的拉動監(jiān)聽毒姨;
*/
public class RefreshAndLoad implements SwipeRefreshLayout.OnRefreshListener, View.OnClickListener {
private Context context;
private ListView listView;
private SwipeRefreshLayout swipeRefreshLayout;
private ProgressBar loadPB;//加載的進(jìn)度條
private TextView loadTV;//加載的文字
private OnLoadListener onLoadListener;//加載
private OnRefreshListener onRefreshListener;//刷新
private OnScrollListener onScrollListener;//拉動加載
private View loadView;
public final int LOADIS = 0;//正在加載
public final int LOADClick = 1;//點擊加載更多...
public final int LOADNO = 2;//暫無更多數(shù)據(jù)可加載
public final int LOADGONE = 3;//隱藏加載欄
public final int LOADVISIBLE = 4;//顯示加載欄
public final int LOADERROR = 5;//加載錯誤
public final int LOADSUCCESS = 6;//加載完成
private boolean isLoad = false;//是否在加載 false-否;true-加載中
private boolean isRefresh = false;//是否在刷新 false-否钉寝;true-刷新中
/**
* 只有加載的
*
* @param context
* @param listView
*/
public RefreshAndLoad(Context context, ListView listView) {
init(context, listView, null);
}
/**
* 只有刷新的
*
* @param context
* @param swipeRefreshLayout
*/
public RefreshAndLoad(Context context, SwipeRefreshLayout swipeRefreshLayout) {
init(context, null, swipeRefreshLayout);
}
/**
* 帶刷新加載的
*
* @param context
* @param listView
* @param swipeRefreshLayout
*/
public RefreshAndLoad(Context context, ListView listView, SwipeRefreshLayout swipeRefreshLayout) {
init(context, listView, swipeRefreshLayout);
}
/**
* 初始化view
*/
private void init(Context context, ListView listView, SwipeRefreshLayout swipeRefreshLayout) {
this.context = context;
this.listView = listView;
this.swipeRefreshLayout = swipeRefreshLayout;
if (listView != null) {
//加載
loadView = LayoutInflater.from(context).inflate(
R.layout.listview_load, null);
loadView.setOnClickListener(this);
loadPB = (ProgressBar) loadView.findViewById(R.id.listview_load_pb);
loadTV = (TextView) loadView.findViewById(R.id.listview_load_tv);
loadTV.setOnClickListener(this);
listView.addFooterView(loadView, null, false);
ListViewScrollListener();
//默認(rèn)是隱藏加載欄的
loadStatus(LOADGONE);
}
if (swipeRefreshLayout != null) {
//刷新
swipeRefreshLayout.setColorSchemeResources(R.color.danorange);
swipeRefreshLayout.setOnRefreshListener(this);
}
}
/**
* 監(jiān)聽listview的滑動
*/
public void ListViewScrollListener() {
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (onScrollListener != null) {
onScrollListener.onScrollStateChanged(view, scrollState);
}
//停止滑動
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
//是否顯示加載
if (isShowLoad()) {
//是否是加載狀態(tài)
if (isLoad != true) {
loadStatus(LOADVISIBLE);
onLoad();
} else {
loadStatus(LOADClick);
}
} else {
loadStatus(LOADGONE);
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (onScrollListener != null) {
onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
}
});
}
/**
* 判斷是否顯示加載欄
*
* @return
*/
public boolean isShowLoad() {
//判斷l(xiāng)istview的條目
if (this.listView.getCount() == 0) {
return false;
}
//判斷l(xiāng)istview是否滑到最后一個
if (listView.getLastVisiblePosition() == (listView.getCount() - 1)) {
//判斷總條目是否大于可見條目弧呐,大于才說明,item是超過屏幕的
if (listView.getCount() > listView.getChildCount()) {
return true;
}
}
return false;
}
/**
* 刷新的
*/
@Override
public void onRefresh() {
if (onRefreshListener != null) {
onRefreshListener.onRefresh();
}
}
/**
* 加載的
*/
public void onLoad() {
isLoad = true;
if (onLoadListener != null) {
loadStatus(LOADIS);
onLoadListener.onLoad();
}
}
/**
* 進(jìn)入app就刷新
*/
public void immediatelyRefresh() {
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
if (swipeRefreshLayout != null) {
swipeRefreshLayout.setRefreshing(true);
onRefresh();
}
}
});
}
/**
* 停止刷新瘩蚪,或者加載
*/
public void stopRefreshAndLoad() {
if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
swipeRefreshLayout.setRefreshing(false);
}
if (isLoad()) {
isLoad = false;
loadStatus(LOADClick);
}
}
/**
* 停止刷新泉懦,或者加載稿黍,
*
* @param status:加載顯示的狀態(tài)
*/
public void stopRefreshAndLoad(int status) {
if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
swipeRefreshLayout.setRefreshing(false);
}
if (isLoad()) {
isLoad = false;
loadStatus(status);
}
}
/**
* 停止刷新
*/
public void stopRefresh() {
if (swipeRefreshLayout != null && swipeRefreshLayout.isRefreshing()) {
swipeRefreshLayout.setRefreshing(false);
}
}
/**
* 停止加載
*/
public void stopLoad() {
loadStatus(LOADGONE);
}
/**
* int LOADIS = 0;//正在加載
* int LOADClick = 1;//點擊加載更多...
* int LOADNO = 2;//暫無更多數(shù)據(jù)可加載
* int LOADGONE = 3;//隱藏加載欄
* int LOADVISIBLE = 4;//顯示加載欄
* int LOADERROR=5;//加載錯誤
* int LOADSUCCESS = 6;//加載完成
*
* @param status:
*/
public void loadStatus(int status) {
switch (status) {
case LOADIS:
loadView.setVisibility(View.VISIBLE);
loadTV.setText("正在加載...");
loadPB.setVisibility(View.VISIBLE);
break;
case LOADClick:
loadTV.setText("點擊加載更多...");
loadPB.setVisibility(View.GONE);
break;
case LOADNO:
loadTV.setText("暫無更多數(shù)據(jù)可加載");
loadPB.setVisibility(View.GONE);
break;
case LOADGONE:
// loadTV.setText("點擊加載更多...");
// loadPB.setVisibility(View.GONE);
loadPB.setVisibility(View.GONE);
loadView.setVisibility(View.GONE);
break;
case LOADVISIBLE:
loadView.setVisibility(View.VISIBLE);
loadStatus(LOADClick);
loadStatus(LOADIS);
break;
case LOADERROR:
loadTV.setText("網(wǎng)絡(luò)錯誤疹瘦,點擊重試");
loadPB.setVisibility(View.GONE);
break;
case LOADSUCCESS:
loadTV.setText("加載完成");
loadPB.setVisibility(View.GONE);
break;
}
}
/**
* 刷新此控件
*/
public void onRefreshThis() {
stopRefreshAndLoad();
//是否顯示加載
if (isShowLoad()) {
loadStatus(LOADClick);
} else {
loadStatus(LOADGONE);
}
}
/**
* 退出activity的時候,需要移除listview的footerview
*/
public void onDestroy() {
if (listView != null && loadView != null)
listView.removeFooterView(loadView);
}
/**
* 加載欄點擊事件
*
* @param v
*/
@Override
public void onClick(View v) {
if (!isLoad()) {
onLoad();
}
}
public boolean isRefresh() {
if (swipeRefreshLayout != null) {
return swipeRefreshLayout.isRefreshing();
} else {
return false;
}
}
// public void setRefresh(boolean refresh) {
// isRefresh = refresh;
// }
public boolean isLoad() {
return isLoad;
}
public void setLoad(boolean load) {
isLoad = load;
}
public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
this.onRefreshListener = onRefreshListener;
}
public void setOnLoadListener(OnLoadListener onLoadListener) {
this.onLoadListener = onLoadListener;
}
public void setOnScrollListener(OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
}
/**
* listview的加載監(jiān)聽
*/
public interface OnLoadListener {
void onLoad();
}
/**
* listview的刷新監(jiān)聽
*/
public interface OnRefreshListener {
void onRefresh();
}
/**
* listview的拉動監(jiān)聽
*/
public interface OnScrollListener {
void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount);
void onScrollStateChanged(AbsListView view, int scrollState);
}
}
```
加載欄【 listview_load.xml 】的代碼
```java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:gravity="center_vertical"
android:padding="7dp">
<ProgressBar
android:id="@+id/listview_load_pb"
style="?android:attr/progressBarStyle"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="30dp"
android:layout_marginStart="56dp" />
<TextView
android:id="@+id/listview_load_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="@string/refresh_more"
android:textColor="@color/TextColorGray"
android:textSize="15sp" />
</RelativeLayout>
輪子的原理巡球,集成和使用都比較簡單言沐,
如有bug,請留言酣栈;