liangjingkanji / BRV

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

单选模式下,onChecked不被调用 #406

Closed GuangNian10000 closed 7 months ago

GuangNian10000 commented 7 months ago

期望结果

如何复现

有人提过类似的问题,https://github.com/liangjingkanji/BRV/issues/398 我目前的问题 调用list.reverse()后,点击item调用了onChecked ,第二次list.reverse()后,再点击onChecked 可能不会被调用,并且list.reverse()后还会出现多个item被选中的情况

代码:

override fun onClick(b: Boolean) {
    list.reverse()
    mViewBind.rv.bindingAdapter.notifyDataSetChanged()
}

onChecked { position, isChecked, isAllChecked ->
    val model = getModel<>(position)
    model.isChecked = isChecked
    model.notifyChange() // 通知UI跟随数据变化
}

R.id.item.onClick {
    getModelOrNull<Catalog>()?.let { data->
       val isChecked = getModel<>().isChecked
       setChecked(adapterPosition, !isChecked)
    }
}

截图

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

版本

GuangNian10000 commented 7 months ago

我的需求是list按接口返回顺序进行正反排序(不按某个字段),单选高亮。在调用list.reverse()后,在进行点击item会出现选中多个item,list里会出现多个isChecked为true的情况

liangjingkanji commented 7 months ago

fork 仓库复现下,我没空去猜测和复现

liangjingkanji commented 7 months ago

文档有写,如果你修改数据集,那么单选状态需要你自己维护,请阅读文档: 选择模式-数据变化

GuangNian10000 commented 7 months ago

好的

GuangNian10000 commented 7 months ago

感谢回复

liangjingkanji commented 7 months ago

你是看了文档没看明白还是压根没看

如果看不明白或许文档写的不清楚, 你可以提交pr或者提交修改建议, 方便后来人

GuangNian10000 commented 7 months ago

看了,但还是没解决问题,只是一个单选我自己其实可以实现。 文档上写:如果列表发生插入/覆盖数据集行为, 那么集合位置/数量和BRV内部保存的选中索引checkedPosition可能对不上

但我现在没有插入或者覆盖,只是调用了reverse()让集合颠倒了一下,在选中时isChecked字段开始不准确了,感觉这是一个bug。 我提交了一个项目:https://github.com/GuangNian10000/brvTest /**

GuangNian10000 commented 7 months ago

单选就不应该出现这种多选的情况

liangjingkanji commented 7 months ago

我是让你fork BRV的仓库在他的demo下复现问题, 你怎么自己创建个项目

liangjingkanji commented 7 months ago

文档写到: 如果列表发生插入/覆盖数据集行为

那我认为可能需要纠正下, "数据的位置或者长度发生任何变化"

我已经介绍过原理了, 就是选中时存储选中索引, 然后下次选中时先将上次选中的`setChecked(false), 这应该不难理解吧

GuangNian10000 commented 7 months ago

文档写到: 如果列表发生插入/覆盖数据集行为

那我认为可能需要纠正下, "数据的位置或者长度发生任何变化"

我已经介绍过原理了, 就是选中时存储选中索引, 然后下次选中时先将上次选中的`setChecked(false), 这应该不难理解吧

嗯我现在是这么做的,那没问题了