Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
期望返回数据时,Android/Java ArrayList为空_Java_Android_Arraylist_Firebase - Fatal编程技术网

期望返回数据时,Android/Java ArrayList为空

期望返回数据时,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

在我的firebaseheloper.java文件中,我记录了arrayList,但在返回之前它显示为空。 有人能告诉我为什么吗

我的代码的相关部分: 今天的公共类扩展了AppCompativeListener{

// 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);