我将数据库中的数据存储到名为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");
}
}
}););