Android开发Android 进阶之路

【 Android 】网络数据分页加载显示

2019-06-30  本文已影响13人  Tyhoo_Wu

前言:一种非常规做法的下拉刷新上拉加载实现方式。

示例图:


示例图.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

上一篇 下一篇

猜你喜欢

热点阅读