你经常听到“上拉加载”这样的字眼吗?你知道这个功能是怎么实现的吗?这篇文章记录了我对“上拉加载”的实现,与大家一起分享。
“上拉加载”针对的是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来控制最终显示哪一个布局。
上面是比较基础一点的操作,其实关于提示项的显示要比这个复杂得过,要考虑很多情况,如何判断服务器返回的是最后一页,已显示和未显示的判断和状态的更新。有时间再继续聊!