如何在实时数据库firebase的单列表视图中同时获取所有子节点的详细信息

时间:2017-07-06 10:46:00

标签: android firebase firebase-realtime-database

我能够在列表视图中检索单个子项的详细信息,但不能从firebase数据库中检索所有子项。我想直接访问孩子。

这是我的代码

database pic

emulator pic

 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);
    }

   }
 }

2 个答案:

答案 0 :(得分:1)

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

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和其他类不需要为常见情况创建自己的适配器。

答案 1 :(得分:0)

请使用此代码:

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);