liangjingkanji / BRV

[使用文档] Android 快速构建 RecyclerView, 比 BRVAH 更简单强大
http://liangjingkanji.github.io/BRV/
MIT License
2.49k stars 317 forks source link

关于上拉刷新数据加载的问题 #365

Closed byjjack closed 1 year ago

byjjack commented 1 year ago

问题描述 服务器返回的数据只有两条,然后我每次上拉刷新列表里就新增两条,然后分页用的页数我直接使用的是index

期望行为 希望刷新数据是正常的

如何复现

任何业务相关问题没有fork仓库复现问题一律无法解决, 凭空猜测只会让问题晦涩难懂, 大量耽误项目维护时间

截图

截屏2023-05-28 18 55 58

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

版本

liangjingkanji commented 1 year ago

因为你没有判断是否有下一页就默认认为一直存在下一页

你看下addData函数的最后一个参数

liangjingkanji commented 1 year ago

都协程的时代了还observe, 你这代码写着不累吗?

byjjack commented 1 year ago

嗯嗯好的,哈哈我这刚转kotlin所有的东西都想试试,还有就是你们的Net 很强很棒十分好用

liangjingkanji commented 1 year ago

看到框架的本质, 不要盲目模仿模板

不要简单问题复杂化, 最后代码量变多你还看不懂

byjjack commented 1 year ago

就是现在遇到一个问题没弄明白,这块我改成了false ,但是上拉正常了,下拉刷新就会多两条数据

截屏2023-05-29 14 48 24
NicodeLee commented 1 year ago

这种不足一页的建议设置一下不满一页时候不开启上拉加载功能。 https://github.com/scwang90/SmartRefreshLayout/blob/master/art/md_property.md

byjjack commented 1 year ago

好的,我试试判断一下

liangjingkanji commented 1 year ago

PageRefreshLayout 默认开启: 不满一页时候关闭上拉加载功能

但是前提依然是得判断数据没有下一页

无需手动开启, 但是可以手动关闭

byjjack commented 1 year ago

已经添加了 但是不管用,下拉刷新还是会增加数据 ,是我设置的不对吗

截屏2023-05-29 15 53 31
liangjingkanji commented 1 year ago

原来你说的下拉刷新增加数据?

那我建议你不要使用addData方法, 因为你使用的ViewModel来处理数据所以就自己debug下代码吧

addData只是简化一下操作并不是必要的函数. 你自己获取数据自己给rv列表赋值吧, 自己去判断是否有下一页

NicodeLee commented 1 year ago

我这边也刚写完,没什么问题,用的跟lz差不多的实现,有数据建议打印一下请求跟返回数据,看后台的页码索引是否正确返回。

       onRefresh {
                mViewModel.getOrder(index - 1)?.observe(this@OrderActivity) {
                    val totalCount = it.total
//                    XLog.e("总数:" + totalCount + ",总页数:" + totalPage(totalCount))
                    if (it.list.isEmpty()) {
                        showEmpty()
                    } else {
                        addData(it.list) {
                            index < (totalPage(totalCount))
                        }
                    }
                }
            }.autoRefresh()
liangjingkanji commented 1 year ago

我这边也刚写完,没什么问题,用的跟lz差不多的实现,有数据建议打印一下请求跟返回数据,看后台的页码索引是否正确返回。

       onRefresh {
                mViewModel.getOrder(index - 1)?.observe(this@OrderActivity) {
                    val totalCount = it.total
//                    XLog.e("总数:" + totalCount + ",总页数:" + totalPage(totalCount))
                    if (it.list.isEmpty()) {
                        showEmpty()
                    } else {
                        addData(it.list) {
                            index < (totalPage(totalCount))
                        }
                    }
                }
            }.autoRefresh()

addData里面有默认判断list是否为空然后showEmpty, 你可以不用自己判断

byjjack commented 1 year ago

嗯嗯我了解了,我这块后台没有返回那个页数,我debug一下看看问题出在哪里,

NicodeLee commented 1 year ago

我这边也刚写完,没什么问题,用的跟lz差不多的实现,有数据建议打印一下请求跟返回数据,看后台的页码索引是否正确返回。

       onRefresh {
                mViewModel.getOrder(index - 1)?.observe(this@OrderActivity) {
                    val totalCount = it.total
//                    XLog.e("总数:" + totalCount + ",总页数:" + totalPage(totalCount))
                    if (it.list.isEmpty()) {
                        showEmpty()
                    } else {
                        addData(it.list) {
                            index < (totalPage(totalCount))
                        }
                    }
                }
            }.autoRefresh()

addData里面有默认判断list是否为空然后showEmpty, 你可以不用自己判断

试了可行,更简洁了,又省几行代码,简单的列表一个类才几十行代码

liangjingkanji commented 1 year ago

我还是更推荐直接使用Net直接一行代码立刻请求返回结果更好, 你这种回调形式太麻烦, 协程时代异步任务应该写同步代码

byjjack commented 1 year ago

修改代码不使用viewmodel 就没有问题了,之前下拉刷新多数据问题没有找到问题原因,介意net和brv 配合使用,不要介意使用viewmodel会出问题

截屏2023-05-29 17 03 48
liangjingkanji commented 1 year ago

我这么说吧, 你认真看下demo或者文档, onRefresh里面应该使用的是scope, 这样才会跟随PageRefreshLayout生命周期

另外我认为问题不是ViewModel的问题只是不兼容, 你可以自己排查下具体代码位置, addData只是给出的一个参考, 你完全可以自己实现一个addData函数

byjjack commented 1 year ago

嗯嗯好的