[CymChad/BaseRecyclerViewAdapterHelper]加载更多onLoadMoreComplete不起作用

2024-08-08 950 views
2

使用最新版本com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.18,加载更多调用onLoadMoreCompete不起作用,仍然不断调用加载更多,另外可否添加开关,关闭预加载机制,目前只有通过调用onLoadMoreEnd才能终止加载

回答

8

目前加载更多的机制我看应该是列表最后一条数据显示后就自动调用加载更多的方法,目前只给出不满一页情况下关闭这种预加载的方法disableLoadMoreIfNotFullPage(),但我在项目需求中实际上上划起到的作用是刷新而不是加载更多,因此我又不能使用disableLoadMoreIfNotFullPage()这个方法,能否把加载更多的机制修改一下,不要列表最后一条数据现实后自动调用,而是根据滑动到底部后再通过滑动去触发加载更多

7

这个是可以配置的

4

如何配置?

3

我的做法是 quickAdapter.setEnableLoadMore(true); quickAdapter.setOnLoadMoreListener(() -> { loadPage++; loadData(); }, recyclerView);

6

那和我现在没区别啊,我现在就是这样写的

3

@ohyesly 我是加载后判断是否有更多页,然后决定是否调用上述代码块

1

@FrankKwok 之前使用过程中因为我判断没有更多页后会调用loadMoreEnd()方法现实加载完成底部view表示已经加载完了,所以之前没发现onLoadMoreComplete方法无效的问题。但现在我的需求要求我上拉实际上是起刷新的作用,就是上拉加载可能随时有新数据刷新出来,所以我就不能加判断是否有更多页的逻辑,因为永远有可能有更多的出现,所以我不能调用loadMoreEnd来终止刷新,于是发现了onLoadMoreComplete无效的问题,但以前旧的版本是有效的,我也不确定是从哪个版本开始出现这个问题

2

明白了,那我尝试复现一下

7

非常感谢

9

@ohyesly 并不是onLoadMoreComplete失效了,而是这个库做法就是滑倒最底端就会调用OnLoadMoreListener里的方法,所以看起来没有效果,之前有效果是因为添加了新的数据

7

@FrankKwok 所以这符合了我之前说的,我也猜是因为滑动到最后一条就自动加载的预加载机制造成的,可否修改或添加一种加载机制,就是不预加载,通过滑动到底部后再监听向上滑动事件来触发加载应该就没问题了

5

@FrankKwok 而且这样你会有BUG,我刚才试了,就算我调用loadMoreEnd,只要我在loadMoreEnd()方法前加 onLoadMoreComplete方法,那么滑动到最后一条数据后虽然显示了没有更多数据的底部view,但每隔大约1秒他就自动触发加载更多的方法,根本停不下来

0

加载更多的机制是最后一个item显示了就回掉,无法判断最后一个item滑到底部才回掉

7

你说的是无限回掉?这种情况一般是跟ScrollView嵌套出现的冲突

1

@1109993488 我并没有嵌套ScrollView,但是就是只要不调用loadMoreEnd方法,就一直不断调用加载更多,调用onLoadMoreComplete也无法停止

6

loadMoreComplete是完成加载,可以进行下一次加载更多的判断了

3

你现在是回调加载更多后又添加了数据了吗?如果添加了数据再调loadMoreComplete,再滑到底部再次回调是正常的,如果没有添加数据只是调用了loadMoreComplete,还是会回调加载更多

7

@1109993488 现在我的需求就是要没有数据的时候光停止加载更多,不能到底了还一直不停回调加载更多,但我又不能彻底关闭加载更多,要到最后一条数据时上划又能尝试加载,等于我这里上划是刷新的作用而不是加载更多,或许你们添加一种新机制会困难的话那有没有方法能在现有机制避免这个问题?

0

@1109993488 我也遇到了同样的问题,我是先addData再loadMoreComplete的,也是无限回调onLoadMoreRequested(); 不过我是嵌套在NestedScrollView中最底部的一个RecyclerView,RecyclerView的高度是wrap_content,我这种情况该怎么解决这个问题?

0

我现在要做的需求其实就是问题 #1215 的功能,我现在尝试给RecyclerView设置onTouchListner,判断向上划的手势,然后当RecyclerView 滚动到底部且上一次请求没有获取到更多数据的时候,设置loadMoreEnd(true),关闭掉没有给多数据底部view,再set一次onLoadMoreListner。现在可以实现滑动到底部时我再向上划就再调用加载更多里的方法,但loadingView却不显示,我看了下代码好像要吧loadDingView的status设置为LoadMoreView.STATUS_DEFAULT,mNextLoadEnable和mLoadMoreEnable 要为true才会显示,现在估计光设置loadMoreEnd(true)的话 ,status和mNextLoadEnable没有得到修改,因此可否提供方法去设置这两个值?或者我的想法是否正确?

2

@esmark-developer 不要用NestedScrollView,直接用RecyclerView,如果要有其他布局可以放到RecyclerView的header里

3

@ohyesly 你可以调enableLoadMoreEndClick(true)开启没有更多数据点击回调 在滑动到底部再上滑的时候你调一下notifyLoadMoreToLoading()就可以回调加载了

4

@1109993488 谢谢,问题完美解决,我增大了首页的数据量调试也暂时没有发现性能的问题,非常感谢!

3

compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.20'

9

@1109993488 我遇到同样的问题,没有看明白你们是怎么解决的,前台依然悬停了"load more failed",现面依然显示着“loading",后台不断地发起网络请求,简直停不下来。下面是代码。

override fun initRecyclerView() {
        recyclerView.layoutManager = LinearLayoutManager(activity)
        adapter = SweetAdapter(activity!!.applicationContext, R.layout.item_sweet)
        recyclerView.adapter = adapter
        adapter!!.enableLoadMoreEndClick(true)
        adapter!!.setOnLoadMoreListener({
            pageNumber++
            isRefresh = false
            loadData(pageSize, pageNumber)
        }, recyclerView)
     }
    protected fun loadData(pageSize: Int, pageNumber: Int) {
        val api = SweetApi.Factory.create()
        api.latestSweet(pageSize, pageNumber)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe({
                    result ->
                    parseResult(result)
                }, {
                    _ ->
                    loadError()
                    loadFinish()
                })
    }

    fun parseResult(result: List<Sweet>) {
        Log.d(TAG, result.toString())

        if (result.isEmpty()) {
            loadError()
        } else {
            loadSuccess(result)
        }
    }

    override fun loadError() {
        if (activity != null) {
            (activity as Activity).toast(R.string.load_failed)
        }
        loadFinish()
    }

    override fun loadSuccess(data: List<Sweet>) {
        Log.d(TAG, data.toString())

        if (isRefresh) {
            adapter!!.setNewData(data)
        } else {
            adapter!!.addData(data)
        }
        loadFinish()
    }

    override fun loadFinish() {
        if (swipeLayout!!.isRefreshing) {
            swipeLayout!!.isRefreshing = false
        }
        adapter!!.loadMoreComplete()
        adapter!!.notifyLoadMoreToLoading()
    }
1

@sitexa loadError的时候应该调loadMoreFail,不应该调loadMoreComplete,如果调loadMoreComplete就会循环

5

@1109993488 我并没有嵌套ScrollView,但是就是只要不调用loadMoreEnd方法,就一直不断调用加载更多,调用onLoadMoreComplete也无法停止

我也遇到了相同的问题,请问 解决了吗?