2017-03-12 71 views
3

我漫游YouTube和堆栈溢出寻找方法来检索从以下数据库teacherName值:如何检索Firebase中的数据并将其显示到ListView上?

Database

我还没有找到我的问题的解决方案,无论我用值或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) { 

     } 
    }); 
} 

我也试过在ChildEventListener中使用for循环,但那也没有奏效。任何人都可以指出我的解决方案?

+0

在问这个问题之前,您有过研究吗? https://github.com/firebase/FirebaseUI-Android –

+0

具体来说,这一个。 https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md –

回答

1
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; 
    } 
} 

然后从火力地堡,您可以将快照映射到类,并添加到适配器。

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

参见:Firebase-UI | Using Firebase to populate ListView

+0

非常感谢!我之前尝试过使用Teacher对象,但我在Teacher类中缺少toString()方法。 – Guilherme

+0

这不是必需的,但你会看到这个问题。 http://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4#29140403 –

0

,因为如果你想监听所有 teacherNames或只是一个你的问题还不清楚。

这是一个简单的方式来获得下/教师中的每个条目(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 
     } 
    }); 

如果你正在寻找得到一个特定的老师的名字,评论,我会改变它。此外,我还没有测试过我在手机上的语法,因此请将其视为伪代码,但应该让您朝着正确的方向前进

查看Firebase查询documentation,它非常简单,并且现在可以在几行代码中完成强大的功能。在搜索时要小心过时的教程,Firebase在过去的1年中添加了其功能

+0

我的目的是让每一个老师的名字。抱歉不清楚。感谢您的答复! – Guilherme

相关问题