如何从实时数据库Firebase的单个列表视图中同时获取所有子项的详细信息



我可以在列表视图中检索单个子项的详细信息,但无法从Firebase数据库中检索所有子项的详细信息。我想直接访问孩子。

这是我的代码

数据库图片

模拟器图片

public class ViewDatabase extends AppCompatActivity {
private static final String TAG = "ViewDatabase";
private DatabaseReference databaseReference;
private ListView mListView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_database_layout);
mListView = (ListView) findViewById(R.id.listview);
databaseReference = 
FirebaseDatabase.getInstance().getReference().child("hello");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
showData(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void showData(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
userinfo user = snapshot.getValue(userinfo.class);
Log.d(TAG, "showData: name: " + user.getName());
Log.d(TAG, "showData: Mobile: " + user.getMob());
Log.d(TAG, "showData: Vehicle: " + user.getVehicle());
Log.d(TAG, "showData: Address: " + user.getaddress());
ArrayList<String> array = new ArrayList<>();
array.add(user.getName());
array.add(user.getMob());
array.add(user.getVehicle());
array.add(user.getaddress());
ArrayAdapter adapter = new ArrayAdapter(this, 
android.R.layout.simple_list_item_1, array);
mListView.setAdapter(adapter);
}
}
}

问题是您要为快照中的每个项目创建一个新的数组和适配器。只应创建一次数组,向其中添加所有项,然后从数组创建适配器:

private void showData(DataSnapshot dataSnapshot) {
ArrayList<String> array = new ArrayList<>();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
userinfo user = snapshot.getValue(userinfo.class);
array.add(user.getName());
array.add(user.getMob());
array.add(user.getVehicle());
array.add(user.getaddress());
}
ArrayAdapter adapter = new ArrayAdapter(this, 
android.R.layout.simple_list_item_1, array);
mListView.setAdapter(adapter);
}
}

这样,您最终会在列表视图中为数据库中的每个子节点提供 4 个项目。虽然这在技术上有效,但这可能不是您想要的。更常见的表示形式是为每个用户向数组中添加单个项目:

private void showData(DataSnapshot dataSnapshot) {
ArrayList<String> array = new ArrayList<>();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
userinfo user = snapshot.getValue(userinfo.class);
array.add(user.getName()+" ("+user.getMob()+")n"+user.getVehicle()+"n"user.getaddress());
}
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array);
mListView.setAdapter(adapter);
}
}

我还建议查看FirebaseUI,它有一个FirebaseListAdapter和其他类,无需为常见情况创建自己的适配器。

请使用此代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference helloRef = rootRef.child("hello");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ArrayList<String> array = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String address = ds.child("address").getValue(String.class);
String mob = ds.child("mob").getValue(String.class);
String name = ds.child("name").getValue(String.class);
String vehicle = ds.child("vehicle").getValue(String.class);
array.add(address + " / " + mob + " / " + name + " / " + vehicle);
Log.d("TAG", address + " / " + mob + " / " + name + " / " + vehicle);
}
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array);
mListView.setAdapter(adapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
helloRef.addListenerForSingleValueEvent(eventListener);

最新更新