点击按钮修改RecyclerView数据后如何刷新?二次修改仍读旧数据怎么办
问题根因
问题核心是同时维护了两套不同步的数据源:
- 第一套是
FirebaseRecyclerAdapter绑定的Firebase实时查询数据源,修改数据库后adapter会自动同步最新值,但你的点击逻辑没有使用这套数据源 - 第二套是你自行定义的静态
allUser数组,所有点击事件的状态读取都从该数组取值,但你修改数据库的active字段后没有同步更新该数组对应位置的值,所以第二次点击时读取的永远是旧数据
另外你调用adapter.notifyDataSetChanged()无效的原因也很简单:adapter本身的数据源已经是最新的,但你读取状态用的是自己的allUser数组,和adapter的数据源完全无关,刷新adapter自然不会生效。
修复方案
方案1(推荐):弃用自行维护的allUser数组,直接使用FirebaseRecyclerAdapter自带数据源
FirebaseRecyclerAdapter已经内置了获取对应position数据的方法,点击事件里直接调用即可,无需自己维护数组同步:
// 把onNoteClick里所有allUser.get(position)的调用替换为以下代码 User currentUser = adapter.getItem(position);
修改数据库时也不需要全量遍历Users节点匹配邮箱,直接通过adapter获取对应节点引用修改即可,性能更高:
// 直接获取当前点击条目的数据库引用,无需遍历全量数据 adapter.getRef(position).child("active").setValue(false);
方案2(必须保留allUser数组时使用):修改数据库后同步更新本地数组
如果业务逻辑必须保留allUser数组,修改数据库的同时要同步更新数组对应位置的状态,修改完成后再通知对应条目刷新:
ds.getRef().child("active").setValue(true).addOnSuccessListener(unused -> { // 同步更新本地数组状态 allUser.get(position).setActive(true); // 只刷新对应position的条目,比全局notifyDataSetChanged性能更好 adapter.notifyItemChanged(position); });
取消激活的逻辑也要做同样的同步处理。
内容的提问来源于stack exchange,提问作者Candice
相关产品推荐
相关产品推荐

