BaseRecyclerViewAdapterHelper
BaseRecyclerViewAdapterHelper copied to clipboard
关于LoadMoreModule的isLoadEndMoreGone参数导致的问题
Describe the bug
loadMoreModule,如果请求列表执行到end状态,也调用了loadMoreEnd(true)
方法,如果我列表想重新刷新,继续加载更多,实际上是不会继续加载更多
To Reproduce Steps to reproduce the behavior:
- 列表一直上拉,加载更多,加载到最底部,调用adapter.loadMreModule.loadMoreEnd(true)方法
- 列表刷新,刷新完成,调用
adapter.loadMoreModule.isEnableLoadMore
和adapter.loadMoreModule.loadMoreComplete
方法 - 继续上拉,加载更多,发现loadMore的position没有,也不会继续触发加载更多
个人分析:
调用isEnableLoadMore或者loadMoreComplete方法,都会优先去调用hasLoadMoreView()
方法
fun hasLoadMoreView(): Boolean {
if (mLoadMoreListener == null || !isEnableLoadMore) {
return false
}
if (loadMoreStatus == LoadMoreStatus.End && isLoadEndMoreGone) {
return false
}
return baseQuickAdapter.data.isNotEmpty()
}
因为isLoadEndMoreGone参数只有在loadMoreEnd的时候才会赋值,没有其他渠道更改该值。导致我手动调用isEnableLoadMore不会触发adapter插入loadmoreViewPosition,调用loadMoreComplete也不会触发loadMoreStatus更改,如果设置新数据,触发loadMoreModule的reset()方法,实际上也没效果,因为添加插入loadMoreViewPosition只能通过设置isEnableLoadMore来触发插入,而isEnableLoadMore又被hasLoadMoreView中isLoadEndMoreGone给堵死了,所以一旦调用loadMoreEnd(true)方法,就会导致loadMore后续整个模块都不能使用了。
临时解决方案 目前项目中解决方案:调用loadMoreEnd()方法,然后调用isEnableLoadMore = false来触发移除loadMoreViewPosition方法,然后在刷新完成后,手动触发isEnableLoadMore= true,来插入loadMoreViewPosition和更改loadMoreStatus方法。
建议: 增加一个resetNomore类似的方法(主要是重新刷新列表之后,重置loadMoreModule中的状态),如果能把reset方法放出来也是极好的。该方法要重置isLoadEndMoreGone的值,如:
fun reset() {
if (mLoadMoreListener != null) {
isLoadEndMoreGone = false
isEnableLoadMore = true
loadMoreStatus = LoadMoreStatus.Complete
}
}
尝试4.0的loadmore,更完善