Gaurav Takte
Gaurav Takte

Reputation: 615

Not getting Firebase database data

I am developing app to display user score that store in firebase database but after running application it won't display data in listview

below is my code:-

listViewLeaderBoard = (ListView) findViewById(R.id.listView_leader_board);

        reference = FirebaseDatabase.getInstance().getReference("score");

        leaderBoards = new ArrayList<>();

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){
                    LeaderBoard leaderBoard = postSnapshot.getValue(LeaderBoard.class);
                    leaderBoards.add(0,leaderBoard);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        //Collections.sort(leaderBoards);
        CustomLeaderBoardAdapter adapter = new CustomLeaderBoardAdapter(getApplicationContext(),R.layout.leader_board_list_layout,leaderBoards);
        listViewLeaderBoard.setAdapter(adapter);
        adapter.notifyDataSetChanged();

Database snapshot:-

enter image description here

Output:-

enter image description here

Upvotes: 2

Views: 981

Answers (3)

Peter Haddad
Peter Haddad

Reputation: 80914

try this:

listViewLeaderBoard = (ListView) findViewById(R.id.listView_leader_board);

    reference = FirebaseDatabase.getInstance().getReference("score");

    leaderBoards = new ArrayList<>();

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()){
                LeaderBoard leaderBoard = postSnapshot.getValue(LeaderBoard.class);
                leaderBoards.add(leaderBoard);
         CustomLeaderBoardAdapter adapter = new CustomLeaderBoardAdapter(getApplicationContext(),R.layout.leader_board_list_layout,leaderBoards);
    listViewLeaderBoard.setAdapter(adapter);
    adapter.notifyDataSetChanged();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

Upvotes: 2

Payal
Payal

Reputation: 31

You can find and change the rules for your database in the Firebase console.Simply choose your project, click on the Database section on the left, and then select the Rules tab.I don't know you have done this or not try this hope this will help you.

{
"rules": {
".read": true,
".write": true
}
}

Upvotes: 1

Alex Mamo
Alex Mamo

Reputation: 138824

To solve this, move this line of code:

List<LeaderBoard> leaderBoards = new ArrayList<>();

inside onDataChange() method, otherwise it will always be, due the asynchronous behaviour of this method which is called even before you are trying to add those objects of LeaderBoard class to the list.

Also, leaderBoards.clear(); is no needed anymore. Your code should look something like this:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> list = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String imageUrl = ds.child("imageUrl").getValue(String.class);
            String name = ds.child("name").getValue(String.class);
            long score = ds.child("score").getValue(Long.class);
            Log.d("TAG", image + " / " + Urlname + " / " + score);
            list.add(image + " / " + Urlname + " / " + score);
        }
        Log.d("TAG", list);
    }

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

Upvotes: 1

Related Questions