Android Studio中基于ArrayList前后大小编写Firebase判断条件
Firebase Realtime Database新增数据后ArrayList大小差异判断实现
核心判断逻辑不要直接对比两个ArrayList对象的引用,针对你需要的「列表大小存在差异即触发业务逻辑」的需求,直接对比列表操作前后的size值即可,实现简单且不会踩对象引用相等的坑。
实现步骤
- 提前定义本地存储Firebase数据的ArrayList实例,不要每次数据更新都重新初始化列表对象,避免丢失历史状态
- 在执行Firebase数据写入操作、或者触发数据拉取监听之前,先记录当前列表的历史大小
- 等新数据成功写入、并全部同步添加到本地ArrayList之后,获取列表的当前大小
- 编写判断条件,两个大小值不相等时就执行对应业务代码,和你给出的伪代码逻辑完全等价
代码示例
Kotlin 实现
// 本地存储Firebase数据的列表,不要在每次数据回调时重新实例化 private val firebaseDataList = ArrayList<YourDataModel>() private val dbRef = FirebaseDatabase.getInstance().getReference("your_target_node") fun uploadNewData(newItem: YourDataModel) { // 写入前先存历史大小 val oldSize = firebaseDataList.size dbRef.push().setValue(newItem).addOnCompleteListener { task -> if (task.isSuccessful) { // 写入成功后把新数据加入本地列表,如果是拉取全量数据则等全量add完成后再取新size firebaseDataList.add(newItem) val newSize = firebaseDataList.size // 大小差异判断 if (oldSize != newSize) { // 此处写你的业务逻辑:比如刷新列表、更新计数、弹出提示等 recyclerAdapter.notifyItemInserted(newSize - 1) } } } }
Java 实现
private ArrayList<YourDataModel> firebaseDataList = new ArrayList<>(); private DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference("your_target_node"); private void uploadNewData(YourDataModel newItem) { // 记录操作前的列表大小 final int oldSize = firebaseDataList.size(); dbRef.push().setValue(newItem).addOnCompleteListener(task -> { if (task.isSuccessful()) { firebaseDataList.add(newItem); int newSize = firebaseDataList.size(); if (oldSize != newSize) { // 执行业务逻辑 recyclerAdapter.notifyItemInserted(newSize - 1); } } }); }
注意事项
如果你使用
ValueEventListener监听节点全量数据变化,需要在给列表重新赋值前先取出旧列表的size,等新数据全部填充到列表后再取新size做对比,不要直接用oldList != newList判断对象差异——如果两个变量指向同一个列表引用,哪怕列表内容已经更新,对象引用对比的结果也会不符合预期。
内容的提问来源于stack exchange,提问作者Errie
相关产品推荐
相关产品推荐

