从firebase检索列表

问题描述:

我知道如何获取一个简单的列表,但有问题时,如果节点嵌套像用户输入一个文本框,他想Section1的学生列表,然后只有杰里和肖恩与他的辊没有应该被显示。 这是我的一个简单列表的代码。从firebase检索列表

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

请建议我该怎么做。

由于您将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(); 
    } 
+0

请问有什么办法同时显示名称和值像我的列表中它只是显示滚动no.And非常感谢你为解决 – fuk

+0

我更新了第一个片段使用'信息getKey()'和' getValue(Integer.class)'来获取名称和值。 –