RecyclerView滑动到底部自动加载

时间:2021-05-11 19:43:09

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

    “上拉加载”针对的是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来控制最终显示哪一个布局。

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