BaseRecyclerViewAdapterHelper源码解读(四) 上拉加载更多

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

image

上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

image

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

return 0;

}

//可加载下一页 有无更多数据

if (!mNextLoadEnable && mLoadMoreView.isLoadEndMoreGone()) {

return 0;

}

//当前数据项个数

if (mData.size() == 0) {

return 0;

}

return 1;

}

重点来了,加载更多的主要逻辑就在这里:当在onBindViewHolder()的时候,根据当前item的position位置,然后去判断是否应该执行加载更多.

具体判断逻辑:当一个item第一次进入window界面时,会调用onBindViewHolder()去绑定数据,这个时候我们知道该position的位置,

于是我们就可以这样干:设置一个mPreLoadNumber标志位置( 当列表滑动到倒数第N个Item的时候(默认是1)回调onLoadMoreRequested()方法 ),

当onBindViewHolder()在绑定数据时的position是最后mPreLoadNumber个时,我们即进行加载更多的回调,然后让调用者去处理.

当然,在回调之前,我们需要进行一些判断,确定当前是否可以进行加载更多.

- mRequestLoadMoreListener监听器是否为null,当前是否处于可以加载更多的状态(mLoadMoreEnable标志位控制)

- 当前有无更多数据(这个由外界调用者决定)

- 当前的数据项个数是否为0,如果没有数据项,那就不必加载更多

- 是否进入倒数的那mPreLoadNumber区域

- 判断当前(mLoadMoreView 这是加载更多的View )加载状态,如果不是默认状态(可能正处于 正在加载中 的状态),则不进行加载

好吧,细心的观众可能已经发现了,上面的这种方式其实有一个缺点:当数据项个数小于1屏幕,那么最后倒数的mPreLoadNumber个肯定是可见的,既然可见那么肯定会执行该item的onBindViewHolder(),执行该方法即会判断是否需要执行加载更多,显然这时是符合条件的,于是就会出现数据未满一屏幕会自动回调onLoadMoreRequested()并且还在那里显示正在加载中.

明显,这时不符合我们的需求的.于是官方有一个解决方案.往下看.

/**

  • bind recyclerView {@link #bindToRecyclerView(RecyclerView)} before use!

  • @see #disableLoadMoreIfNotFullPage(RecyclerView)

*/

public void disableLoadMoreIfNotFullPage() {

//检查当前RecyclerView是否为null

checkNotNull();

disableLoadMoreIfNotFullPage(getRecyclerView());

}

/**

  • check if full page after {@link #setNewData(List)}, if full, it will enable load more again.

  • 不是配置项!!

  • 这个方法是用来检查是否满一屏的,所以只推荐在 {@link #setNewData(List)} 之后使用

  • 原理:先关闭 load more,检查完了再决定是否开启

  • 数据项个数未满一屏幕,则不开启load more

  • 数据项个数 > 一屏幕,则继续开启load more

  • 不是配置项!!

  • @param recyclerView your recyclerView

  • @see #setNewData(List)

*/

public void disableLoadMoreIfNotFullPage(RecyclerView recyclerView) {

// 设置加载状态为false

setEnableLoadMore(false);

if (recyclerView == null) return;

RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();

if (manager == null) return;

if (manager instanceof LinearLayoutManager) {

final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) manager;

recyclerView.postDelayed(new Runnable() {

@Override

public void run() {

//数据项个数 > 一屏幕,则继续开启load more

if ((linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1) !=

getItemCount()) {

setEnableLoadMore(true);

}

}

}, 50);

} else if (manager instanceof StaggeredGridLayoutManager) {

final StaggeredGridLayoutManager staggeredGridLayoutManager =

(StaggeredGridLayoutManager) manager;

recyclerView.postDelayed(new Runnable() {

@Override

public void run() {

//返回StaggeredGridLayoutManager布局的跨度数

final int[] positions = new int[staggeredGridLayoutManager.getSpanCount()];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值