2017-11-25 146 views
-1

我知道如何獲取一個簡單的列表,但有問題時,如果節點嵌套像用戶輸入一個文本框,他想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

請建議我該怎麼做。

回答

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(); 
    } 
+0

請問有什麼辦法同時顯示名稱和值像我的列表中它只是顯示滾動no.And非常感謝你爲解決 – fuk

+0

我更新了第一個片段使用'信息getKey()'和' getValue(Integer.class)'來獲取名稱和值。 –