Java,Android/在数组列表中存储值,但列表为空



我将数据库中的数据存储到名为nameList的arrayList中。

在函数"get_spinner_info"中,值成功存储在nameList中。

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

错误代码为"java.lang.IndexOutOfBoundsException:索引:0,大小: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方法启动并加载ASYNCHRONOUS数据(注册lsitener(,因此Log.d("Spinner nameList : ", nameList.get(0));之后会调用onDataChange

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

将其放在onDataChange的末尾(在当前for循环之后(,以检查阵列中可用/存在的项目

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

同步问题导致这种错误

如果你已经有数据做这个

创建接口类

public interface DataCallback {
public void reciveData(ArrayList<String> nameList ,boolean isOk);
}

在您的类中my_Item调用类似的接口

public void get_spinner_info(String brand,String item,String prod_key,DataCallback callback){
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);
}
// here you should check if the result available or NOT to prevent null exceptions 
if(nameList.size()>0){
callback.reciveData(nameList,true);// true and false used to check data if available or null
}
else{
callback.reciveData(nameList,false);

}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError){
}
});
}

现在,当您调用get_spinner_info时,您需要回调,如下

get_spinner_info(brand, item, product_key,new DataCallback() {
@Override
public void callback(ArrayList<String> nameList, boolean isOk) {
if (isOk){
/// you have all data recived
Log.d("Spinner namelist :  ", nameList.get(0));
}else {
// no data available
Log.i("TAG", "callback: No Data Available");
}
}
}););

相关内容

  • 没有找到相关文章

最新更新