Android 如何从Firebase检索数据并将其显示在ListView上?

Android 如何从Firebase检索数据并将其显示在ListView上?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在YouTube和Stack Overflow上漫游,寻找从以下数据库检索teacherName值的方法: 我还没有找到解决问题的方法,不管我使用的是Value还是ChildEventListener。这是我正在使用的代码: public class ViewTeachersActivity extends AppCompatActivity { // Define the Teacher Firebase DatabaseReference private DatabaseReferen

我在YouTube和Stack Overflow上漫游,寻找从以下数据库检索teacherName值的方法:

我还没有找到解决问题的方法,不管我使用的是Value还是ChildEventListener。这是我正在使用的代码:

public class ViewTeachersActivity extends AppCompatActivity {

// Define the Teacher Firebase DatabaseReference
private DatabaseReference databaseTeachers;

// Define a String ArrayList for the teachers
private ArrayList<String> teachersList = new ArrayList<>();

// Define a ListView to display the data
private ListView listViewTeachers;

// Define an ArrayAdapter for the list
private ArrayAdapter<String> arrayAdapter;

/**
 * onCreate method
 */

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

    // Associate the Teacher Firebase Database Reference with the database's teacher object
    databaseTeachers = FirebaseDatabase.getInstance().getReference();
    databaseTeachers = databaseTeachers.child("teachers");

    // Associate the teachers' list with the corresponding ListView
    listViewTeachers = (ListView) findViewById(R.id.list_teachers);

    // Set the ArrayAdapter to the ListView
    arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, teachersList);
    listViewTeachers.setAdapter(arrayAdapter);

    // Attach a ChildEventListener to the teacher database, so we can retrieve the teacher entries
    databaseTeachers.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            // Get the value from the DataSnapshot and add it to the teachers' list
            String teacher = dataSnapshot.getValue(String.class);
            teachersList.add(teacher);

            // Notify the ArrayAdapter that there was a change
            arrayAdapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
公共类ViewTeachersActivity扩展了AppCompatActivity{
//定义教师Firebase数据库引用
私人数据库参考数据库教师;
//为教师定义字符串数组列表
private ArrayList teachersList=new ArrayList();
//定义ListView以显示数据
私人ListView ListView教师;
//为列表定义ArrayAdapter
专用阵列适配器阵列适配器;
/**
*onCreate方法
*/
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u view\u教师);
//将教师Firebase数据库引用与数据库的教师对象关联
databaseTeachers=FirebaseDatabase.getInstance().getReference();
databaseTeachers=databaseTeachers.child(“教师”);
//将教师列表与相应的ListView关联
listViewTeachers=(ListView)findViewById(R.id.list\u教师);
//将ArrayAdapter设置为ListView
arrayAdapter=新的arrayAdapter(这是android.R.layout.simple\u list\u item\u 1,teachersList);
setAdapter(arrayAdapter);
//将ChildEventListener附加到教师数据库,以便我们可以检索教师条目
databaseTeachers.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
//从DataSnapshot中获取值并将其添加到教师列表中
String teacher=dataSnapshot.getValue(String.class);
教师列表。添加(教师);
//通知阵列适配器发生了更改
arrayAdapter.notifyDataSetChanged();
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
我也尝试过在ChildEventListener中使用for循环,但也不起作用。有人能告诉我一个解决方案吗

String teacher = dataSnapshot.getValue(String.class);
这里没有字符串,而是一个对象

所以,您需要一个Java类

public class Teacher {
    String teacherID, teacherEmail; // etc. all fieldnames in the database

    public Teacher() {
    }

    // getters

    // setters

    @Override
    public String toString() {
        return this.teacherID + ": " + this.teacherEmail;
    }
}
然后,您可以从Firebase将快照映射到该类并添加到适配器

Teacher teacher = (Teacher) dataSnapshot.getValue(Teacher.class);
String teacherString = String.valueOf(teacher);
arrayAdapter.add(teacherString);

请参阅:

,因为您的问题不清楚,您是要听所有教师的名字,还是只听一个

这是一种获取/teachers下每个条目(uuid键)的所有“teacherName”的简单方法,并向该查询添加一个侦听器:

FirebaseDatabase.getInstance()
    .getReference()
    .child("teachers")
    .orderByChild("teacherName")
    .addValueEventListener(listener); //listener example below


ValueEventListener listener = new new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            dataSnapshot.getChildren().forEach(

               // assuming you are using RetroLambda, if not, implement Consumer<? super T> action
                // update change ListView here
            );
        }


        @Override
        public void onCancelled(FirebaseError firebaseError)
        {
            //handle errors here
        }
    });
FirebaseDatabase.getInstance()
.getReference()
.儿童(“教师”)
.orderByChild(“教师姓名”)
.addValueEventListener(listener);//下面的侦听器示例
ValueEventListener=新建ValueEventListener()
{
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot)
{
dataSnapshot.getChildren().forEach(

//假设您使用的是RetroLambda,如果不是,请在询问此问题之前执行ConsumerDid您的研究?具体来说,就是这一个。非常感谢!我之前曾尝试使用Teacher对象,但缺少toString()方法。这不是必须的,但是你会看到这个问题。我的目的是要知道每个老师的名字。很抱歉不清楚。谢谢你的回答!