从Firebase实时数据库读取数据

时间:2019-12-06 17:43:59

标签: android firebase firebase-realtime-database

我基本上是在尝试从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天的时间,我也不知道下一步该怎么做。

1 个答案:

答案 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();
    }
});