首页 > 解决方案 > Java,Android / 数组列表中的存储值,但列表为空

问题描述

我将数据库中的数据存储到一个名为 nameList 的数组列表中。

在函数“get_spinner_info”中,值成功地存储在 nameList 中。

但是,在此函数之外没有 nameList 的值。

错误代码是“java.lang.IndexOutOfBoundsException: Index: 0, Size: 0”。

我真的需要你的帮助。


public class my_Item {
    private Context context;
    private FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference datebaseReference = firebaseDatabase.getReference();
    ArrayList<String> nameList = new ArrayList<String>();

    
    // Get the value from the database and put them in the 'nameList'.
    //In this code, I can successfully check the value within the 'nameList'.
    public void get_spinner_info(String brand, String item, String prod_key){
        datebaseReference.child(brand).child(item).child(prod_key).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.child("myValue").getChildren()) {
                    String prod_name = ds.getValue().toString();  
                    nameList.add(prod_name);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }


    // But the nameList is empty in this part.
    public void callFunction(final String brand, final String item, final String product_name, final String product_key, final int product_Num) {
        get_spinner_info(brand, item, product_key);
        Log.d("Spinner namelist :  ", nameList.get(0));
    }
}

标签: javaandroidarraysarraylistnull

解决方案


get_spinner_info方法启动和异步数据加载(注册 lsitener),因此onDataChange将在之后被调用Log.d("Spinner nameList : ", nameList.get(0));

您的数据只有在onDataChange通话后才可用,这可能需要一些时间。get_spinner_info刚开始加载你的数据,并不意味着所有数据都将在方法调用结束后可用

将其放在onDataChange(当前for循环之后)的末尾以检查您的项目可用/存在于数组中

for (String name : nameList) Log.d("Spinner", "name: " + name);

推荐阅读