讓RecyclerView上拉刷新下拉加載更多更簡便易用
效果圖
dd.gif
說明
1.本demo使用的數據,均由gank.io提供
2.下拉刷新使用的是SwipeRefreshLayout
3.上拉加載更多使用的是BRVAH提供的BaseRecyclerViewAdapterHelper:2.1.3
抽取接口
public interface IPagingService<T extends List> {
/**
* 加載分頁數據
* @param page 加載第幾頁
* @param limit 1頁加載多少條
*/
void getData(int page,int limit, Observer<T> observer);
}</code></pre>
編寫基類(實現分頁邏輯)
public class BasePagingActivity<T> extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, BaseQuickAdapter.RequestLoadMoreListener {
private static final int PAGE_SIZE = 20;
private RecyclerView mRecyclerView;
private BaseQuickAdapter mQuickAdapter;
private IPagingService<List<T>> mPagingService;
private SwipeRefreshLayout mSwipeRefreshLayout;
private int currentPage;
private int lastPage;
private void setSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout) {
if (swipeRefreshLayout != null) {
mSwipeRefreshLayout = swipeRefreshLayout;
mSwipeRefreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.white);
mSwipeRefreshLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
swipeRefreshLayout.setOnRefreshListener(this);
} else {
throw new NullPointerException("swipeRefreshLayout not null");
}
}
private void setRecyclerView(RecyclerView recyclerView) {
mRecyclerView = recyclerView;
if (mRecyclerView.getLayoutManager() == null) {
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
}
private void setQuickAdapter(BaseQuickAdapter quickAdapter) {
if (quickAdapter != null) {
mQuickAdapter = quickAdapter;
mQuickAdapter.openLoadAnimation();
mQuickAdapter.openLoadMore(PAGE_SIZE);
mQuickAdapter.setOnLoadMoreListener(this);
mRecyclerView.setAdapter(quickAdapter);
} else {
throw new NullPointerException("swipeRefreshLayout not null");
}
}
/**
* 開始獲取數據,提供給子類調用
*/
protected void startGetData(RecyclerView recyclerView,SwipeRefreshLayout swipeRefreshLayout,BaseQuickAdapter quickAdapter, IPagingService<List<T>> pagingService){
mPagingService = pagingService;
setRecyclerView(recyclerView);
setSwipeRefreshLayout(swipeRefreshLayout);
setQuickAdapter(quickAdapter);
onLoadFirstData();
}
@Override
public void onRefresh() {
currentPage = 1;
mPagingService.getData(currentPage, PAGE_SIZE, new Observer<List<T>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(BasePagingActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();
mSwipeRefreshLayout.setRefreshing(false);
currentPage = lastPage;
}
@Override
public void onNext(List<T> list) {
if (list == null) return;
mQuickAdapter.getData().clear();
mQuickAdapter.addData(list);
mQuickAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
}
});
}
@Override
public void onLoadMoreRequested() {
lastPage = currentPage;
currentPage++;
mPagingService.getData(currentPage, PAGE_SIZE, new Observer<List<T>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(BasePagingActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();
currentPage = lastPage;
}
@Override
public void onNext(List<T> list) {
if ((list != null && list.isEmpty())) {
Toast.makeText(BasePagingActivity.this,"沒有更多數據了",Toast.LENGTH_SHORT).show();
mQuickAdapter.addData(list);
mQuickAdapter.loadComplete();
} else {
mQuickAdapter.addData(list);
}
lastPage = currentPage;
}
});
}
public void onLoadFirstData(){
lastPage = currentPage = 1;
mSwipeRefreshLayout.setRefreshing(true);
mPagingService.getData(currentPage, PAGE_SIZE, new Observer<List<T>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(BasePagingActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();
mSwipeRefreshLayout.setRefreshing(false);
}
@Override
public void onNext(List<T> list) {
if (list == null) return;
mQuickAdapter.addData(list);
mQuickAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
}
});
}
}</code></pre>
fragment同樣可以這樣做
使用
1.實現IPagingService
public class WelfareServer implements IPagingService<List<WelfareEntity>>{
@Override
public void getData(int page, int limit, Observer<List<WelfareEntity>> observer) {
RetrofitManager.getInstance().createReq(GankIo.class)
.getWelfareImg(limit, page)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
2.繼承BasePagingActivity并調用startGetData方法
public class MainActivity extends BasePagingActivity<WelfareEntity> {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_layout);
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.list);
startGetData(mRecyclerView, mSwipeRefreshLayout, new BaseQuickAdapter<WelfareEntity>(R.layout.item_welfare,new ArrayList()){
@Override
protected void convert(BaseViewHolder baseViewHolder, WelfareEntity welfareEntity) {
Glide.with(MainActivity.this)
.load(welfareEntity.getUrl())
.placeholder(R.mipmap.load_image_bg)
.into((ImageView) baseViewHolder.getView(R.id.iv));
}
},new WelfareServer());
}
}</code></pre>
來自:http://www.jianshu.com/p/f3c3a84c2e99
本文由用戶 ElenaMacken 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!