You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:13:59