BaseRecyclerViewAdapterHelper icon indicating copy to clipboard operation
BaseRecyclerViewAdapterHelper copied to clipboard

关于LoadMoreModule的isLoadEndMoreGone参数导致的问题

Open aowoWolf opened this issue 1 year ago • 1 comments

Describe the bug loadMoreModule,如果请求列表执行到end状态,也调用了loadMoreEnd(true)方法,如果我列表想重新刷新,继续加载更多,实际上是不会继续加载更多

To Reproduce Steps to reproduce the behavior:

  1. 列表一直上拉,加载更多,加载到最底部,调用adapter.loadMreModule.loadMoreEnd(true)方法
  2. 列表刷新,刷新完成,调用 adapter.loadMoreModule.isEnableLoadMoreadapter.loadMoreModule.loadMoreComplete方法
  3. 继续上拉,加载更多,发现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
        }
    }

aowoWolf avatar Aug 17 '22 03:08 aowoWolf

尝试4.0的loadmore,更完善

limuyang2 avatar Sep 02 '22 03:09 limuyang2