前言:一种非常规做法的下拉刷新上拉加载实现方式。
示例图:
示例图.gif
API使用豆瓣电影 Top 250,RxJava + Retrofit 进行网络请求,Glide 加载图片。
导入必要的库:
// MD库(里面包含原生RecyclerView控件)
implementation 'com.google.android.material:material:1.0.0'
// RxAndroid
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
// Glide
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
思路:
通过监听 RecyclerView 的addOnScrollListener
来获取onScrollStateChanged
的改变,重写onScrollStateChanged
,判断是否滑动到最后一个可见位置来进行新数据的加载。通过 List 的addAll
将新数据和旧数据都加载到 List 里来实现加载更多。
核心代码:
1.判断是否是最后一个可见位置
private boolean isVisibleBottom(RecyclerView recyclerView) {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
int visibleItemCount = layoutManager.getChildCount();
int totalItemCount = layoutManager.getItemCount();
int state = recyclerView.getScrollState();
return (visibleItemCount > 0
&& lastVisibleItemPosition == totalItemCount - 1
&& state == RecyclerView.SCROLL_STATE_IDLE);
}
2.RecyclerView滑动监听
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (RecyclerView.SCROLL_STATE_IDLE == newState
&& isVisibleBottom(recyclerView)) {
// 加载数据
getDoubanTop250Data()
}
}
});
3.网络请求,往List里添加数据
private List<DoubanBean.SubjectsBean> mList = new ArrayList<>();
// start 是从第几个开始
// count 是加载多少条数据
private void getDoubanTop250Data() {
// 网络请求
Observable<DoubanBean> observable = mDoubanAPI.getDoubanTop250(
"0b2bdeda43b5688921839c8ecb20399b", start, count);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<DoubanBean>() {
@Override
public void onSubscribe(Disposable d) {
Log.d(TAG, "onSubscribe: ");
}
@Override
public void onNext(DoubanBean doubanBean) {
Log.d(TAG, "onNext: ");
// 新数据添加到List里
List<DoubanBean.SubjectsBean> list = doubanBean.getSubjects();
if (list != null) {
mList.addAll(list);
start = start + count;
}
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "onError: ");
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete: ");
}
});
}
示例代码已上传至 Github,如果本文对你有帮助请点喜欢♥。
https://github.com/cnwutianhao/LoadMore
相关文章:
【 Android 】RecyclerView 使用方法总结
https://www.jianshu.com/p/c4cfe38a91ed
https://github.com/cnwutianhao/RecyclerView
【 Android 】豆瓣电影 API 指南
https://www.jianshu.com/p/a7e51129b042
https://github.com/cnwutianhao/DoubanMovie
网友评论