我基本上是在尝试从Firebase获取“名称”键的值,然后将所有名称显示在列表视图中。问题是即使我的代码没有错误,Firebase中的数据也不会显示在listView中。
Firebase结构: MY FIREBASE DATABASE STRUCTURE
我的代码:
List<String> list = new ArrayList<>();
list.addAll(FFunc());
Toast.makeText(this, "Success!", Toast.LENGTH_SHORT).show();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_listview, R.id.textView, list);
simpleListView.setAdapter(arrayAdapter);
public List<String> FFunc(){
final List<String> arr = new ArrayList<>();
DatabaseReference database = FirebaseDatabase.getInstance().getReference("Employee");
DatabaseReference myRef = database.child("name");
myRef.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data : dataSnapshot.getChildren()) {
String name = data.getValue(String.class).toString();
arr.add(name);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
return arr;
}
通过使用上面的代码,我从Firebase得到了一个没有值的空listView。任何人都可以告诉我解决该问题的方法。我是Android的初学者,因此即使花了整整2天的时间,我也不知道下一步该怎么做。
答案 0 :(得分:1)
使用LiveData
作为返回类型,并观察其值的变化以执行所需的操作。
private MutableLiveData<List<String>> userNameMutableLiveData = new MutableLiveData<>();
public MutableLiveData<List<String>> FFunc() {
final List<String> arr = new ArrayList<>();
DatabaseReference database = FirebaseDatabase.getInstance().getReference("Employee");
DatabaseReference myRef = database.child("name");
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data : dataSnapshot.getChildren()) {
String name = data.getValue(String.class).toString();
arr.add(name);
}
....
userNameMutableLiveData.setValue(arr);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
return userNameMutableLiveData;
}
然后从您的Activity/Fragment
观察LiveData
,然后在onChanged
内进行所需的操作。
List<String> list = new ArrayList<>();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.activity_listview, R.id.textView, list);
simpleListView.setAdapter(arrayAdapter);
....
FFunc().observe(this, new Observer<List<String>>() {
@Override
public void onChanged(List<String> names) {
//here, do whatever you want on `names`
list = names;
arrayAdapter.notifyDataSetChanged();
}
});