我知道如何获取一个简单的列表,但是当节点嵌套时遇到问题就像用户进入文本框中他想要的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树:
请建议我怎么做。
答案 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();
}