如何在ArrayList的ArrayList中正确添加Firebase经纬度数据?
问题解决:Firebase经纬度存入嵌套ArrayList数据重复
问题原因
你当前的核心问题是重复复用了同一个longitudes ArrayList对象。由于ArrayList是引用类型,你每次循环只是往这个对象里追加新的经纬度值,再将这个对象的引用添加到外层aList中。这导致外层列表里的所有子列表实际上指向同一个内存地址的对象,最终所有子列表都会显示成最后一次循环结束后的完整数据,同时数据会持续累积。
解决方案
修改思路很简单:每次循环内部新建独立的子ArrayList,确保每个用户的经纬度都存储在单独的对象中,同时每次数据更新时清空外层列表避免旧数据残留。
修改后的完整代码
初始化部分
// 仅需初始化外层嵌套列表 ArrayList<ArrayList<String>> aList = new ArrayList<>();
Firebase数据监听部分
databaseReference.child("hospital").addValueEventListener(new ValueEventListener() { @SuppressLint("SetTextI18n") @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 每次数据更新时,先清空外层列表,避免旧数据残留 aList.clear(); for (DataSnapshot snapshot1 : snapshot.getChildren()) { // 每次循环新建独立的子ArrayList,存储当前用户的经纬度 ArrayList<String> userLocation = new ArrayList<>(); userLocation.add(snapshot1.child("longitude").getValue().toString()); userLocation.add(snapshot1.child("latitude").getValue().toString()); // 将独立的子列表添加到外层列表 aList.add(userLocation); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 可选:添加错误日志,便于调试 Log.e("FirebaseError", "数据获取失败:" + error.getMessage()); } });
关键修改点
- 移除了循环外的
longitudes变量,改为在循环内部创建userLocation子ArrayList,确保每个用户的位置数据都存储在独立的对象中,不会互相覆盖。 - 每次
onDataChange触发时清空aList,防止多次数据更新导致列表积累旧数据。 - 去掉了冗余的
count变量,直接使用aList.add(userLocation)将子列表追加到外层列表末尾,逻辑更简洁直观。
内容的提问来源于stack exchange,提问作者rushi
相关产品推荐
相关产品推荐

