列出从firebase检索

时间:2017-11-25 15:55:18

标签: java android listview firebase

我知道如何获取一个简单的列表,但是当节点嵌套时遇到问题就像用户进入文本框中他想要的Section1的学生列表那样只有Jerry和Sean带有他的滚动否应该显示。 这是我的简单列表代码。

public class MainActivity extends AppCompatActivity {
ListView listView;
DatabaseReference dref;
ArrayList<String> list=new ArrayList<>();
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView=(ListView)findViewById(R.id.ListView);
    adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list);
    listView.setAdapter(adapter);
    dref= FirebaseDatabase.getInstance().getReference();
    dref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            String value=dataSnapshot.getValue(String.class);
            list.add(value);
            adapter.notifyDataSetChanged();
        }

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

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            String value=dataSnapshot.getValue(String.class);
            list.remove(value);
            adapter.notifyDataSetChanged();
        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

JSON树:

enter image description here

请建议我怎么做。

1 个答案:

答案 0 :(得分:0)

由于您将ChildEventListener附加到数据库的根目录,因此将使用每个部分的快照调用onChildAdded。因此,Section1一次,Section2一次,Section3一次。

如果您只想收听特定部分,请将您的听众添加到该部分:

dref= FirebaseDatabase.getInstance().getReference();
dref.child("Section1").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        String key = dataSnapshot.getKey();
        int value  = dataSnapshot.getValue(Integer.class);
        list.add(key+": "+value);
        adapter.notifyDataSetChanged();
    }

在上文中,由于您只是在收听Section1,因此onChildAdded会针对Jerry触发一次,针对Sean触发一次。但这些是快照的,因此代码使用getKey()

另一方面:如果你想向学生展示所有部分,你  需要将监听器保留在根目录上并访问原始快照的较低级别属性。为此,您可以使用getChild()访问该媒体资源,也可以循环访问getChildren()以访问所有媒体资源。

dref= FirebaseDatabase.getInstance().getReference();
dref.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        for (DataSnapshot student: dataSnapshot.getChildren()) {
            String value=student.getValue(String.class);
            list.add(value);
        }
        adapter.notifyDataSetChanged();
    }