Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

加载更多onLoadMoreComplete不起作用 #1206

Closed
ohyesly opened this issue Jun 12, 2017 · 27 comments
Closed

加载更多onLoadMoreComplete不起作用 #1206

ohyesly opened this issue Jun 12, 2017 · 27 comments

Comments

@ohyesly
Copy link

ohyesly commented Jun 12, 2017

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

@ohyesly
Copy link
Author

ohyesly commented Jun 12, 2017

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

@FrankKwok
Copy link
Contributor

这个是可以配置的

@ohyesly
Copy link
Author

ohyesly commented Jun 12, 2017

如何配置?

@FrankKwok
Copy link
Contributor

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

@ohyesly
Copy link
Author

ohyesly commented Jun 13, 2017

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

@FrankKwok
Copy link
Contributor

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

@ohyesly
Copy link
Author

ohyesly commented Jun 13, 2017

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

@FrankKwok
Copy link
Contributor

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

@ohyesly
Copy link
Author

ohyesly commented Jun 13, 2017

非常感谢

@FrankKwok
Copy link
Contributor

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

@ohyesly
Copy link
Author

ohyesly commented Jun 13, 2017

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

@ohyesly
Copy link
Author

ohyesly commented Jun 13, 2017

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

@1109993488
Copy link
Collaborator

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

@1109993488
Copy link
Collaborator

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

@ohyesly
Copy link
Author

ohyesly commented Jun 14, 2017

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

@1109993488
Copy link
Collaborator

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

@1109993488
Copy link
Collaborator

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

@ohyesly
Copy link
Author

ohyesly commented Jun 14, 2017

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

@esmark-developer
Copy link

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

@ohyesly
Copy link
Author

ohyesly commented Jun 15, 2017

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

@1109993488
Copy link
Collaborator

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

1109993488 added a commit to 1109993488/BaseRecyclerViewAdapterHelper that referenced this issue Jun 15, 2017
@1109993488
Copy link
Collaborator

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

@esmark-developer
Copy link

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

@CymChad
Copy link
Owner

CymChad commented Jun 18, 2017

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

@sitexa
Copy link

sitexa commented Jun 20, 2017

@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()
    }

@1109993488
Copy link
Collaborator

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

@2834658151qq
Copy link

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants