java - 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));
}
}
解决方案
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);
推荐阅读
- laravel - 如何增加laravel背包中summnote字段的文本区域大小
- javascript - 如何将服务器端口提供给客户端
- css - Flex wrap - 堆叠行而不拉伸?
- java - 如何修复 SpringBoot 应用程序中 SimpleJdbcInsert 中的错误
- powershell - 我正在尝试禁用 office365 E1 许可证的子许可证
- c - 如何在 C 中使用 fork 写入和读取文件
- html - 悬停时隐藏外部节点元素
- r - R Shiny 和使用端口 3838:一个安全漏洞?
- opengl - 镜面高光随着相机的移动而移动
- reactjs - 如何为生成的项目添加骨架负载