zoukankan      html  css  js  c++  java
  • RecyclerView滑动到底部自动加载

        你经常听到“上拉加载”这样的字眼吗?你知道这个功能是怎么实现的吗?这篇文章记录了我对“上拉加载”的实现,与大家一起分享。

        “上拉加载”针对的是RecyclerView或者Listview这样的列表控件(本文以RecyclerView为例),一般和“数据分页”配合使用,旨在实现“分页加载,随用随取”,从而避免了一个接口返回过多的数据。

        RecyclerView每加载一个item都会调用一次onBindViewHolder方法,并且只在item由不可见变为可见的时候才会调用此方法。我们可以通过onBindViewHolder方法来判断是否已经到达列表的底部。

    public void onBindViewHolder(CollectionViewHolder holder, int position) {
            holder.fillData(mData.get(position));
            if(position == getItemCount()-1){//已经到达列表的底部
                loadMoreData();
            }
        }

        上面代码中我们通过比较position和getItemCount判断当前加载的item是不是最后一条,如果是最后一条的话就要执行网络请求加载下一页数据。

        上面就是我实现“上拉加载”的核心思想。使用过程中仅仅这样还是不够的,还需要继续完善、优化,下面记录一下我是如何添加底部提示的。

        描述:如果所有的数据都已经加载完毕了(服务器已经返回了最后一页数据),我们在最后一条数据下面显示一个“没有更多”的提示。

        实现:这里要提一下RecyclerView加载item的原理:RecyclerView在加载item之前会调用getItemCount方法,然后调用相同次数的onBindViewHolder方法,显示相同条数的数据。现在我需要RecyclerView在原来数据的基础之上,多显示一条数据,所以我进行了如下修改:

    public int getItemCount() {
            return mData.size() + 1;
        }

    这样就为“提示”这根萝卜挖好了一个坑。可是onCreateViewHolder并没有position这样的参数,我们没有办法为普通数据项和最后一行的提示项生成特定的item。我是通过这样的方法解决这个问题的,我把数据项的展示布局和“没有更多”的布局放在同一个item当中,然后再根据onBindViewHolder传递过来的position来控制最终显示哪一个布局。

        上面是比较基础一点的操作,其实关于提示项的显示要比这个复杂得过,要考虑很多情况,如何判断服务器返回的是最后一页,已显示和未显示的判断和状态的更新。有时间再继续聊!

  • 相关阅读:
    bzoj1066 [SCOI2007]蜥蜴
    bzoj2957 楼房重建
    bzoj2243 [SDOI2011]染色
    bzoj1858 [Scoi2010]序列操作
    bzoj1051 [HAOI2006]受欢迎的牛
    二分图最大匹配模板(pascal)
    gulp-file-include 合并 html 文件
    vue-cli项目结构分析
    svn汉化包安装无效的解决办法
    vue-cli npm install 失败
  • 原文地址:https://www.cnblogs.com/hsji/p/4955957.html
Copyright © 2011-2022 走看看