Skip to content

Commit 9671f24

Browse files
committed
PullToRefresh demo
1 parent 49e85b3 commit 9671f24

File tree

2 files changed

+148
-64
lines changed

2 files changed

+148
-64
lines changed

app/src/main/java/com/chad/baserecyclerviewadapterhelper/PullToRefreshUseActivity.java

Lines changed: 147 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.graphics.Color;
44
import android.os.Bundle;
55
import android.os.Handler;
6+
import android.os.Looper;
67
import android.support.v4.widget.SwipeRefreshLayout;
78
import android.support.v7.widget.LinearLayoutManager;
89
import android.support.v7.widget.RecyclerView;
@@ -14,44 +15,120 @@
1415
import com.chad.baserecyclerviewadapterhelper.adapter.PullToRefreshAdapter;
1516
import com.chad.baserecyclerviewadapterhelper.base.BaseActivity;
1617
import com.chad.baserecyclerviewadapterhelper.data.DataServer;
18+
import com.chad.baserecyclerviewadapterhelper.entity.Status;
1719
import com.chad.baserecyclerviewadapterhelper.loadmore.CustomLoadMoreView;
1820
import com.chad.library.adapter.base.BaseQuickAdapter;
1921
import com.chad.library.adapter.base.listener.OnItemClickListener;
2022

23+
import java.util.List;
24+
25+
26+
interface RequestCallBack {
27+
void success(List<Status> data);
28+
29+
void fail(Exception e);
30+
}
31+
32+
class Request extends Thread {
33+
private static final int PAGE_SIZE = 6;
34+
private int mPage;
35+
private RequestCallBack mCallBack;
36+
private Handler mHandler;
37+
38+
private static boolean mFirstPageNoMore;
39+
private static boolean mFirstError = true;
40+
41+
public Request(int page, RequestCallBack callBack) {
42+
mPage = page;
43+
mCallBack = callBack;
44+
mHandler = new Handler(Looper.getMainLooper());
45+
}
46+
47+
@Override
48+
public void run() {
49+
try {Thread.sleep(500);} catch (InterruptedException e) {}
50+
51+
if (mPage == 2 && mFirstError) {
52+
mFirstError = false;
53+
mHandler.post(new Runnable() {
54+
@Override
55+
public void run() {
56+
mCallBack.fail(new RuntimeException("fail"));
57+
}
58+
});
59+
} else {
60+
int size = PAGE_SIZE;
61+
if (mPage == 1) {
62+
if (mFirstPageNoMore) {
63+
size = 1;
64+
}
65+
mFirstPageNoMore = !mFirstPageNoMore;
66+
if (!mFirstError) {
67+
mFirstError = true;
68+
}
69+
} else if (mPage == 4) {
70+
size = 1;
71+
}
72+
73+
final int dataSize = size;
74+
mHandler.post(new Runnable() {
75+
@Override
76+
public void run() {
77+
mCallBack.success(DataServer.getSampleData(dataSize));
78+
}
79+
});
80+
}
81+
}
82+
}
2183

2284
/**
2385
* https://github.com/CymChad/BaseRecyclerViewAdapterHelper
2486
*/
25-
public class PullToRefreshUseActivity extends BaseActivity implements BaseQuickAdapter.RequestLoadMoreListener, SwipeRefreshLayout.OnRefreshListener {
26-
private RecyclerView mRecyclerView;
27-
private PullToRefreshAdapter pullToRefreshAdapter;
28-
private SwipeRefreshLayout mSwipeRefreshLayout;
29-
30-
private static final int TOTAL_COUNTER = 18;
87+
public class PullToRefreshUseActivity extends BaseActivity {
3188

3289
private static final int PAGE_SIZE = 6;
3390

34-
private int delayMillis = 1000;
35-
36-
private int mCurrentCounter = 0;
91+
private RecyclerView mRecyclerView;
92+
private SwipeRefreshLayout mSwipeRefreshLayout;
93+
private PullToRefreshAdapter mAdapter;
3794

38-
private boolean isErr;
39-
private boolean mLoadMoreEndGone = false;
95+
private int mNextRequestPage = 1;
4096

4197
@Override
4298
protected void onCreate(Bundle savedInstanceState) {
4399
super.onCreate(savedInstanceState);
44-
45100
setContentView(R.layout.activity_main);
46101
mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);
47102
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeLayout);
48-
mSwipeRefreshLayout.setOnRefreshListener(this);
49103
mSwipeRefreshLayout.setColorSchemeColors(Color.rgb(47, 223, 189));
50104
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
51105
setTitle("Pull TO Refresh Use");
52106
setBackBtn();
53107
initAdapter();
54108
addHeadView();
109+
initRefreshLayout();
110+
mSwipeRefreshLayout.setRefreshing(true);
111+
refresh();
112+
}
113+
114+
private void initAdapter() {
115+
mAdapter = new PullToRefreshAdapter();
116+
mAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
117+
@Override
118+
public void onLoadMoreRequested() {
119+
loadMore();
120+
}
121+
});
122+
mAdapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_LEFT);
123+
// mAdapter.setPreLoadNumber(3);
124+
mRecyclerView.setAdapter(mAdapter);
125+
126+
mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
127+
@Override
128+
public void onSimpleItemClick(final BaseQuickAdapter adapter, final View view, final int position) {
129+
Toast.makeText(PullToRefreshUseActivity.this, Integer.toString(position), Toast.LENGTH_LONG).show();
130+
}
131+
});
55132
}
56133

57134
private void addHeadView() {
@@ -61,70 +138,78 @@ private void addHeadView() {
61138
headView.setOnClickListener(new View.OnClickListener() {
62139
@Override
63140
public void onClick(View v) {
64-
mLoadMoreEndGone = true;
65-
pullToRefreshAdapter.setLoadMoreView(new CustomLoadMoreView());
66-
mRecyclerView.setAdapter(pullToRefreshAdapter);
141+
mAdapter.setNewData(null);
142+
mAdapter.setLoadMoreView(new CustomLoadMoreView());
143+
mRecyclerView.setAdapter(mAdapter);
67144
Toast.makeText(PullToRefreshUseActivity.this, "change complete", Toast.LENGTH_LONG).show();
145+
146+
mSwipeRefreshLayout.setRefreshing(true);
147+
refresh();
68148
}
69149
});
70-
pullToRefreshAdapter.addHeaderView(headView);
150+
mAdapter.addHeaderView(headView);
71151
}
72152

73-
@Override
74-
public void onLoadMoreRequested() {
75-
mSwipeRefreshLayout.setEnabled(false);
76-
if (pullToRefreshAdapter.getData().size() < PAGE_SIZE) {
77-
pullToRefreshAdapter.loadMoreEnd(true);
78-
} else {
79-
if (mCurrentCounter >= TOTAL_COUNTER) {
80-
// pullToRefreshAdapter.loadMoreEnd();//default visible
81-
pullToRefreshAdapter.loadMoreEnd(mLoadMoreEndGone);//true is gone,false is visible
82-
} else {
83-
if (isErr) {
84-
pullToRefreshAdapter.addData(DataServer.getSampleData(PAGE_SIZE));
85-
mCurrentCounter = pullToRefreshAdapter.getData().size();
86-
pullToRefreshAdapter.loadMoreComplete();
87-
} else {
88-
isErr = true;
89-
Toast.makeText(PullToRefreshUseActivity.this, R.string.network_err, Toast.LENGTH_LONG).show();
90-
pullToRefreshAdapter.loadMoreFail();
91-
92-
}
153+
private void initRefreshLayout() {
154+
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
155+
@Override
156+
public void onRefresh() {
157+
refresh();
93158
}
94-
mSwipeRefreshLayout.setEnabled(true);
95-
}
159+
});
96160
}
97161

98-
@Override
99-
public void onRefresh() {
100-
pullToRefreshAdapter.setEnableLoadMore(false);
101-
new Handler().postDelayed(new Runnable() {
162+
private void refresh() {
163+
mNextRequestPage = 1;
164+
mAdapter.setEnableLoadMore(false);//这里的作用是防止下拉刷新的时候还可以上拉加载
165+
new Request(mNextRequestPage, new RequestCallBack() {
166+
@Override
167+
public void success(List<Status> data) {
168+
setData(true, data);
169+
mAdapter.setEnableLoadMore(true);
170+
mSwipeRefreshLayout.setRefreshing(false);
171+
}
172+
102173
@Override
103-
public void run() {
104-
pullToRefreshAdapter.setNewData(DataServer.getSampleData(PAGE_SIZE));
105-
isErr = false;
106-
mCurrentCounter = PAGE_SIZE;
174+
public void fail(Exception e) {
175+
Toast.makeText(PullToRefreshUseActivity.this, R.string.network_err, Toast.LENGTH_LONG).show();
176+
mAdapter.setEnableLoadMore(true);
107177
mSwipeRefreshLayout.setRefreshing(false);
108-
pullToRefreshAdapter.setEnableLoadMore(true);
109178
}
110-
}, delayMillis);
179+
}).start();
111180
}
112181

113-
private void initAdapter() {
114-
pullToRefreshAdapter = new PullToRefreshAdapter();
115-
pullToRefreshAdapter.setOnLoadMoreListener(this, mRecyclerView);
116-
pullToRefreshAdapter.openLoadAnimation(BaseQuickAdapter.SLIDEIN_LEFT);
117-
// pullToRefreshAdapter.setPreLoadNumber(3);
118-
mRecyclerView.setAdapter(pullToRefreshAdapter);
119-
mCurrentCounter = pullToRefreshAdapter.getData().size();
182+
private void loadMore() {
183+
new Request(mNextRequestPage, new RequestCallBack() {
184+
@Override
185+
public void success(List<Status> data) {
186+
setData(false, data);
187+
}
120188

121-
mRecyclerView.addOnItemTouchListener(new OnItemClickListener() {
122189
@Override
123-
public void onSimpleItemClick(final BaseQuickAdapter adapter, final View view, final int position) {
124-
Toast.makeText(PullToRefreshUseActivity.this, Integer.toString(position), Toast.LENGTH_LONG).show();
190+
public void fail(Exception e) {
191+
mAdapter.loadMoreFail();
192+
Toast.makeText(PullToRefreshUseActivity.this, R.string.network_err, Toast.LENGTH_LONG).show();
125193
}
126-
});
194+
}).start();
127195
}
128196

129-
130-
}
197+
private void setData(boolean isRefresh, List data) {
198+
mNextRequestPage++;
199+
final int size = data == null ? 0 : data.size();
200+
if (isRefresh) {
201+
mAdapter.setNewData(data);
202+
} else {
203+
if (size > 0) {
204+
mAdapter.addData(data);
205+
}
206+
}
207+
if (size < PAGE_SIZE) {
208+
//第一页如果不够一页就不显示没有更多数据布局
209+
mAdapter.loadMoreEnd(isRefresh);
210+
Toast.makeText(this, "no more data", Toast.LENGTH_SHORT).show();
211+
} else {
212+
mAdapter.loadMoreComplete();
213+
}
214+
}
215+
}

app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/PullToRefreshAdapter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import android.widget.TextView;
88

99
import com.chad.baserecyclerviewadapterhelper.R;
10-
import com.chad.baserecyclerviewadapterhelper.data.DataServer;
1110
import com.chad.baserecyclerviewadapterhelper.entity.Status;
1211
import com.chad.baserecyclerviewadapterhelper.util.SpannableStringUtils;
1312
import com.chad.baserecyclerviewadapterhelper.util.ToastUtils;
@@ -25,7 +24,7 @@
2524
*/
2625
public class PullToRefreshAdapter extends BaseQuickAdapter<Status, BaseViewHolder> {
2726
public PullToRefreshAdapter() {
28-
super( R.layout.layout_animation, DataServer.getSampleData(10));
27+
super( R.layout.layout_animation, null);
2928
}
3029

3130
@Override

0 commit comments

Comments
 (0)