期望返回数据时,Android/Java ArrayList为空
在我的firebaseheloper.java文件中,我记录了arrayList,但在返回之前它显示为空。 有人能告诉我为什么吗 我的代码的相关部分: 今天的公共类扩展了AppCompativeListener{期望返回数据时,Android/Java ArrayList为空,java,android,arraylist,firebase,Java,Android,Arraylist,Firebase,在我的firebaseheloper.java文件中,我记录了arrayList,但在返回之前它显示为空。 有人能告诉我为什么吗 我的代码的相关部分: 今天的公共类扩展了AppCompativeListener{ // Variables for the DrawLayout: private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mToggle; private Toolbar mToolbar; // Fireb
// Variables for the DrawLayout:
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
private Toolbar mToolbar;
// Firebase variables:
private DatabaseReference mDatabase;
private ChildEventListener mChildEventListener;
private DatabaseReference mDatabaseExercisesToday;
// Firebase spinner:
FirebaseHelper helper;
// For storing username such as chrismichaeladams@gmail.com:
String mUsername;
Spinner spinnerExercises;
TextView textViewSpinner;
private String[] exerciseArray;
private ArrayList<String> exerciseArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_today);
// Create instance of Firebase database root:
mDatabase = FirebaseDatabase.getInstance().getReference();
// Get a instance of Firebase database starting at today's date:
mDatabaseExercisesToday = FirebaseDatabase.getInstance().getReference("2-14-17");
/***** Connect UI elements with code: *****/
mToolbar = (Toolbar) findViewById(R.id.nav_action);
mDrawerLayout = (DrawerLayout) findViewById(R.id.activity_today);
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// Pass our database instance to the Firebase Helper class for spinner:
helper = new FirebaseHelper(mDatabaseExercisesToday);
exerciseArrayList = helper.retrieve();
Log.i("ArrayList: ", exerciseArrayList.toString());
exerciseArray = new String[exerciseArrayList.size()];
exerciseArray = exerciseArrayList.toArray(exerciseArray);
// Spinner:
spinnerExercises = (Spinner) findViewById(R.id.spinner_Exercises2);
textViewSpinner = (TextView) findViewById(R.id.textView_spinner2);
ArrayAdapter<String> adapter_state = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, exerciseArray);
adapter_state.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerExercises.setAdapter(adapter_state);
spinnerExercises.setOnItemSelectedListener(this);
还想添加我的ArrayList输出的Logcat。除了返回之前,它始终不是空的:
问题在于这种方法
public ArrayList<String> retrieve()
{
final ArrayList<String> exercisesArrayList=new ArrayList<>();
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot,exercisesArrayList);
Log.i("ArrayListadded1", exercisesArrayList.toString());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot,exercisesArrayList);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
//fetchDataDelete(dataSnapshot,exercisesArrayList);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}
);
Log.i("ArrayListBefReturn", exercisesArrayList.toString());
return exercisesArrayList;
}
立即执行。但它不是这样工作的。它将在DatabaseHelper实例调用OnChildaded(…)
时执行。您注册一个侦听器来“侦听”某些类型的事件。但只有当此事件发生时,才会调用侦听器方法。在这种情况下,当添加子对象时,将调用方法OnChildaded(…)将调用
,并获取数据(…)
所以您正在记录列表,但是
fetchData(…)
还没有被调用。我正在使用Google Firebase数据库。每当添加或更改数据时,都会调用OnChildaded和onChildChanged。但我也有这样的印象,当它第一次加载时,它会调用OnChildaded,而OnChildaded又会调用fetchData。我将进一步了解这一点,看看这是否指向了正确的方向继续。谢谢你的回复。
package christopheradams.com.workoutapp8;
import com.google.firebase.database.IgnoreExtraProperties;
/**
* Created by Christopher on 2/13/2017.
*/
@IgnoreExtraProperties
public class Exercises {
public String exerciseName;
public String reps;
public String weight;
public String username;
public Exercises(){
}
public Exercises(String exerciseName, String reps, String weight, String username){
this.exerciseName = exerciseName;
this.reps = reps;
this.weight = weight;
this.username = username;
}
public String getExerciseName() {
return exerciseName;
}
public String getReps() {
return reps;
}
public String getWeight() {
return weight;
}
public String getUsername() {
return username;
}
public void setExerciseName(String exerciseName) {
this.exerciseName = exerciseName;
}
public void setReps(String reps) {
this.reps = reps;
}
public void setWeight(String weight) {
this.weight = weight;
}
public void setUsername(String username) {
this.username = username;
}
}
public ArrayList<String> retrieve()
{
final ArrayList<String> exercisesArrayList=new ArrayList<>();
db.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot,exercisesArrayList);
Log.i("ArrayListadded1", exercisesArrayList.toString());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
fetchData(dataSnapshot,exercisesArrayList);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
//fetchDataDelete(dataSnapshot,exercisesArrayList);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}
);
Log.i("ArrayListBefReturn", exercisesArrayList.toString());
return exercisesArrayList;
}
final ArrayList<String> exercisesArrayList=new ArrayList<>();
fetchData(dataSnapshot,exercisesArrayList);