Android中ArrayList添加Firebase数据失效问题求助
解决ArrayList添加Firebase数据后大小为0的问题
嗨,我来帮你排查这个问题,你遇到的集合始终为空的情况,主要有两个关键原因,咱们一步步梳理:
1. 变量名不一致的低级错误
你定义的集合是ArrayList<String> onooltuud = new ArrayList<String>();,但在onDataChange回调里却使用了onoolts.add(...),最后打印的也是onoolts.size()——这相当于你往一个完全不同的(甚至可能未初始化的)集合里添加数据,而你真正关心的onooltuud从始至终都没被操作过,这肯定会导致它的大小一直是0。
修复方式:把所有涉及这个集合的变量名统一,比如全部改成onooltuud。
2. Firebase数据库操作的异步特性(核心问题)
Firebase的addValueEventListener是异步执行的——它会在后台线程发起网络请求获取数据,主线程不会等待这个请求完成,而是继续执行后面的代码。你在添加监听器之后立刻调用Log.i("testSize:", String.valueOf(onoolts.size()));,这时候onDataChange还没被触发(数据还没从Firebase服务器拉取回来),所以集合自然是空的。
修复方式:所有需要用到集合数据的逻辑,必须放在onDataChange方法内部,或者在onDataChange里调用对应的处理方法。
修正后的完整代码示例
public class OnooltActivity2 extends AppCompatActivity implements View.OnClickListener { // 统一变量名 ArrayList<String> onooltuud = new ArrayList<String>(); Button save; FirebaseDatabase database; DatabaseReference ref; int davaaniiNo; // 假设这个变量已经被正确初始化 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.onoolt_activity_2); save = (Button) findViewById(R.id.save); database = FirebaseDatabase.getInstance(); ref = database.getReference("db").child("davaa").child(String.valueOf(davaaniiNo) + "-iinDavaa"); Query query = ref.orderByChild("onooltDugaar"); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { int temp = (int) dataSnapshot.getChildrenCount(); Log.i("count", String.valueOf(temp)); // 清空集合,避免数据变化时重复添加 onooltuud.clear(); for (DataSnapshot snapshot : dataSnapshot.getChildren()) { Log.i("snapshot", snapshot.getValue().toString()); Onoolt onoolt = snapshot.getValue(Onoolt.class); // 使用正确的变量名添加数据 onooltuud.add(onoolt.getOnooltDugaar()); } // 在这里操作集合数据,此时数据已经成功添加 Log.i("testSize:", String.valueOf(onooltuud.size())); // 比如更新UI、处理业务逻辑都要放在这里 updateUIWithData(); } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(OnooltActivity2.this, "Датаг уншиж чадсангүй: " + databaseError.getCode(), Toast.LENGTH_SHORT).show(); } }); // 这里的代码会先于onDataChange执行,不要在这里使用集合数据 } // 示例:处理集合数据的方法,比如更新UI private void updateUIWithData() { // 例如将数据绑定到RecyclerView、Spinner等组件 } }
额外提示
- 如果只需要从Firebase获取一次数据(不需要监听数据变化),可以用
addListenerForSingleValueEvent代替addValueEventListener,避免多次触发回调。 - 记得确保
Onoolt类的字段和Firebase数据库中的字段名称完全匹配(或者使用@PropertyName注解映射),否则snapshot.getValue(Onoolt.class)会返回null,导致无法获取onooltDugaar。
内容的提问来源于stack exchange,提问作者Amarsaikhan
相关产品推荐
相关产品推荐

