2017-02-17 62 views
0

在我的FirebaseHelper.java文件中,Log.i是arrayList,但它在返回之前显示为空。 有人能为我指出正确的方向吗?当期望返回数据时,Android/Java ArrayList为空

我的代码的相关部分: 公共类今天扩展AppCompatActivity实现OnItemSelectedListener {

// 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 [email protected]: 
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); 

FireBaseHelper.java:

public class FirebaseHelper { 
    DatabaseReference db; 
    Boolean saved=null; 



    public FirebaseHelper(DatabaseReference db) { 
     this.db = db; 
    } 

    //SAVE 
    public Boolean save(Exercises exercises) 
    { 
     if(exercises==null) 
     { 
      saved=false; 
     }else 
     { 
      try 
      { 
       db.push().setValue(exercises); 
       saved=true; 
      }catch (DatabaseException e) 
      { 
       e.printStackTrace(); 
       saved=false; 
      } 
     } 
     return saved; 


    } 
    //READ 
    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; 
    } 

    private void fetchData(DataSnapshot snapshot,ArrayList<String> exercisesArrayList) 
    { 
      exercisesArrayList.add(snapshot.getValue(Exercises.class).getExerciseName()); 
      Log.i("ArrayList2", exercisesArrayList.toString()); 


    } 

// private void fetchDataDelete(DataSnapshot snapshot,ArrayList<String> exercisesArrayList) 
// { 
//  // Add The exercise to our exerciseArrayList: 
//  exercisesArrayList.remove(snapshot.getValue(Exercises.class).getExerciseName()); 
// 
// } 
} 

Exercises.java:

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; 
    } 
} 

而且想要添加我的ArrayList outp的Logcat UT。它整个是不是空的,除了返回前: enter image description here

回答

0

的问题是这种方法

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

您创建一个新的空的ArrayList然后你注册一个监听器,但不立即调用fetchData(...)。我想你认为这行代码

fetchData(dataSnapshot,exercisesArrayList); 

立即执行。但它不这样工作。它将在DatabaseHelper实例调用onChildAdded(...)时执行。你注册一个监听者来“听”某些事件。但是只有当这个事件发生时,监听器方法才会被调用。在这种情况下,当添加一个孩子时,方法onChildAdded(...)将被调用并且fetchData(...)也被调用。

所以你正在记录列表,但fetchData(...)还没有被调用。

+1

我正在使用Google Firebase数据库。无论何时添加或更改数据,都会调用onChildAdded和onChildChanged。但我也有一种印象,第一次加载时会调用onChildAdded,然后调用fetchData。我会更多地考虑这一点,看看这是否指向正确的方向。谢谢您的回复。 –

相关问题