美文网首页Android开发Android 进阶之路
【 Android 】网络数据分页加载显示

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

作者: Tyhoo_Wu | 来源:发表于2019-06-30 09:47 被阅读13次

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

    示例图:


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

    相关文章

      网友评论

        本文标题:【 Android 】网络数据分页加载显示

        本文链接:https://www.haomeiwen.com/subject/wjyvcctx.html