简体   繁体   中英

Retrieve Multiple Child branches Firebase

Ok so I have made a CardView hold one database item(in this case a football player) and adapted it in a RecyclerView. My Firebase Database looks like this:

Players:
    |---Goalkeepers:
           |--GoalkeeperName
                     |--(And some other data fields)
    |---Defenders:
    |---Midfielders:
    |---Attackers

My database reference looks like this:

playersDatabase = FirebaseDatabase.getInstance().getReference("Players").child("Goalkeepers");

If I leave the reference as ("Players"), it will give me 4 empty fields representing the Goalkeeper, Defenders, Midfielders and Attackers branch. How do I display all data from all Position branches such as Goalkeeper, Defenders, Midfielders and Attackers?

Also is there any way of displaying all the players in an organised way with headings in my layout so it looks like this?

Goalkeepers(heading)
Goalkeeper1
Goalkeeper2
Defenders (heading)
Defender1
Defender2

This is the code from the actual app:

public class PlayerList extends AppCompatActivity {

private RecyclerView mPlayerList;
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("Players");





@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_squad_list);
    //playersDatabase = FirebaseDatabase.getInstance().getReference("Players").child("Goalkeepers");
    playersRef.keepSynced(true);

    //new code
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String typeOfPlayer = ds.getKey();
                Log.d("TAG", typeOfPlayer);

                for(DataSnapshot dSnapshot : dataSnapshot.child(typeOfPlayer).getChildren()) {
                    String player = dSnapshot.getKey();
                    Log.d("TAG", "    " + player);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    playersRef.addListenerForSingleValueEvent(valueEventListener);




    mPlayerList = (RecyclerView) findViewById(R.id.my_recycle_view);
    mPlayerList.setHasFixedSize(true);
    mPlayerList.setLayoutManager(new LinearLayoutManager(this));



}



@Override
protected void onStart() {
    super.onStart();
    FirebaseRecyclerAdapter<Player, PlayerViewHolder>firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Player, PlayerViewHolder>(Player.class, R.layout.player_row, PlayerViewHolder.class, playersRef) {
        @Override
        protected void populateViewHolder(PlayerViewHolder viewHolder, Player model, int position) {

            viewHolder.setPlayerName(model.getPlayerName());
            viewHolder.setPlayerSurname(model.getPlayerSurname());
            viewHolder.setPlayerPosition(model.getPlayerPosition());

        }
    };


    mPlayerList.setAdapter(firebaseRecyclerAdapter);
}


public static class PlayerViewHolder extends RecyclerView.ViewHolder{

    View mView;
    public PlayerViewHolder(View itemView){
        super(itemView);
        mView = itemView;
    }

    public void setPlayerName (String playerName){
        TextView textViewName = (TextView) mView.findViewById(R.id.textViewName);
        textViewName.setText(playerName);
    }
    public void setPlayerSurname (String playerSurname){
        TextView textViewName = (TextView) mView.findViewById(R.id.textViewSurname);
        textViewName.setText(playerSurname);
    }
    public void setPlayerPosition (String playerPosition){
        TextView textViewName = (TextView) mView.findViewById(R.id.textViewPosition);
        textViewName.setText(playerPosition);
    }
}

}

Any help is appreciated. Thanks

To display those players accordingly to the following database structure:

Goalkeepers
    Goalkeeper1
    Goalkeeper2
Defenders
    Defender1
    Defender2 

Please use the following code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("Players");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String typeOfPlayer = ds.getKey();
            Log.d("TAG", typeOfPlayer);

            DatabaseReference playerRef = playersRef.child(typeOfPlayer);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                        String player = dSnapshot.getKey();
                        Log.d("TAG", "    " + player);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            playerRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
playersRef.addListenerForSingleValueEvent(valueEventListener);

Edit:

According to your edited post, please use the following code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("Players");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String typeOfPlayer = ds.getKey();
            Log.d("TAG", typeOfPlayer);

            for(DataSnapshot dSnapshot : dataSnapshot.child(typeOfPlayer).getChildren()) {
                String player = dSnapshot.getKey();
                Log.d("TAG", "    " + player);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
playersRef.addListenerForSingleValueEvent(valueEventListener);

Your result must be:

Attackers
Defenders
Goalkeepers
    Goalkeeper1
Midfielders

Try this code ..

    private void readData(){
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    rootRef.child("Players").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String typeOfPlayer = ds.getKey();
                Log.d("TAG", typeOfPlayer);

                for(DataSnapshot dSnapshot : dataSnapshot.child(typeOfPlayer).getChildren()) {
                    String player = dSnapshot.getKey();
                    Log.d("TAG", "    " + player);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

and i hope add internet permission into manifest file.. more information refer this link https://www.simplifiedcoding.net/firebase-realtime-database-crud/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM