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);
}
'takeDataFromFirebase'は' null'を返します。あなたは何を期待しましたか? (コールバックを使用して)非同期APIを使用する方法を学ぶ必要があります – Selvin
私のコードを書き直し、非同期メソッド 'doInBackground'を追加しましたが、私の配列がnullである理由を理解できません。この愚かな質問は、しかし、忠実な、私はちょうど初心者です。私は自分のアクティビティにダウンロードした情報をどのように返すことができますか?私は何をする必要がありますか? – Kralon