2017-10-02 14 views
-2

Activityがあります。別のクラスのDataBaseの関数を使用する必要があります。データベースでコードFireBaseデータベースから情報を取得し、結果としてArrayListを返す必要があります。しかし、nullに配列takeDataFromFirebaseを使用すると、サイズはnullになります。 FireBase情報を含む配列を自分のアクティビティにどのように取得できますか?別のクラスから配列を取得できない理由

public class DataBase{  
public ArrayList<String> arraylist = new ArrayList<>(); 
public ArrayList<String> takeDataFromFirebase(DatabaseReference dRef) { 
     usersRef = dRef.child(USERS_CHILD); 
     ValueEventListener valueEventListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot ds : dataSnapshot.getChildren()) { 
        String userKey = ds.getKey(); 
        DatabaseReference messagesRef = usersRef.child(userKey).child(USER_MESSAGES); 
        ValueEventListener eventListener = new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) { 
           messageText = dSnapshot.child(USER_MESSAGE_TEXT).getValue(String.class); 
           arrayList.add(messageText); 
          } 
         } 
         @Override 
         public void onCancelled(DatabaseError databaseError) {} 
        }; 
        messagesRef.addListenerForSingleValueEvent(eventListener); 
       } 
      } 
      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }; 
     usersRef.addListenerForSingleValueEvent(valueEventListener); 

     return null; 
    } 
} 

と、私はこの方法を使用する私の活動:

public class Categories extends AppCompatActivity{ 


private static final String TAG = "CATEGORIES"; 
FirebaseAuth mAuth; 

private ListView all_problems_list_view; 
private Button add_problem_button, signOut; 
private static long back_pressed; 


FirebaseDatabase mDataBase; 
DatabaseReference dRef; 
DatabaseReference userRef; 
DataBase dataBaseFunctions; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(layout.activity_categories); 

    dataBaseFunctions = new DataBase(); 
    mAuth = FirebaseAuth.getInstance(); 


    mDataBase = FirebaseDatabase.getInstance(); 
    dRef = mDataBase.getReference(); 
    userRef = dRef.child("Users"); 
    //region add all items 

    all_problems_list_view = (ListView) findViewById(id.all_problems_list_view); 
    add_problem_button = (Button) findViewById(id.add_problem_button); 
    signOut = (Button) findViewById(id.SignOutBut); 
    //endregion 

    //region set onClick to buttons 
    signOut.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      logout(); 
     } 
    }); 

    add_problem_button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivity(new Intent(Categories.this, sendEmailActivity.class)); 
     } 
    }); 


    //endregiond 



    ArrayList<String> list = dataBaseFunctions.takeDataFromFirebase(dRef); 
    ArrayAdapter<String> adapter = new ArrayAdapter<>(this, 
      android.R.layout.simple_list_item_1, list); 
    all_problems_list_view.setAdapter(adapter); 


} 
+1

'takeDataFromFirebase'は' null'を返します。あなたは何を期待しましたか? (コールバックを使用して)非同期APIを使用する方法を学ぶ必要があります – Selvin

+0

私のコードを書き直し、非同期メソッド 'doInBackground'を追加しましたが、私の配列がnullである理由を理解できません。この愚かな質問は、しかし、忠実な、私はちょうど初心者です。私は自分のアクティビティにダウンロードした情報をどのように返すことができますか?私は何をする必要がありますか? – Kralon

答えて

1

あなたの結果は常にnullになりますので、nullを返しますtakeDataFromFirebaseあなたの機能..あなたが取得したい配列、ArrayListのiで、このヌルを交換してください推測。

+0

私は黙っていますが、初心者で、なぜ配列がnullを返すのかわかりません。私は 'messageText'のログ値に戻り、必要なすべての情報を返します。しかし、私はこのメソッドを使用すると、どのように私はこの情報を返すことができますか? – Kralon

+0

あなたの関数 'takeDataFromFirebase'では、あなたが持っている戻り値は" null "だけです。あなたがそれを呼び出すと、結果はnullになります! DataBaseクラスで 'arraylist'を埋めているのが分かります。私はそれがあなたがCategoriesクラスに乗ろうとするこの配列だと思います。 これを取得するには、少し複雑ですが、arraylistが変更されたときに検出してアダプターを更新するリスナーを2番目のクラスに実装する必要があります。 –

関連する問題