Mostrando dados do Firebase no ListView

Ok, então eu comecei a correr mostrando o User ID, mas não marcar. Então comecei a fazer algumas alterações, esqueci o que tinha mudado e agora estou de volta a null null novamente. Eu sinto que posso ter deletado algo ou escrito algo errado.

dbref.addValueEventListener(new com.google.firebase.database.ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { ArrayList list = new ArrayList(); list.clear(); for(DataSnapshot ds :dataSnapshot.getChildren()) { Score Result = ds.getValue(Score.class); String userId = String.valueOf(Result.getUserId()); String score = String.valueOf(Result.getScore()); list.add(userId); list.add(score); } adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, list); LvRanking.setAdapter(adapter); } 

Aqui está meu modelo:

 public class Score { private String userId, score; public Score() {} public Score(String userId, String score) { this.userId = userId; this.score = score; } public String getUserId() { return userId; } public String getScore() { return score; } @Override public String toString() { return "Score{" + "userId='" + userId + '\'' + ", score='" + score + '\'' + '}'; } } 

Banco de dados: Link para minha captura de canvas do database

Este é um problema clássico com APIs assíncronas. Para que isso funcione, altere sua class de modelo de acordo com as Convenções de Nomenclatura Java . Você classifica assim:

 public class Score { private String userId, score; public Score() {} public Score(String userId, String score) { this.userId = userId; this.score = score; } public String getUserId() { return userId; } public String getScore() { return score; } @Override public String toString() { return "Score{" + "userId='" + userId + '\'' + ", score='" + score + '\'' + '}'; } } 

Observe também que o método onDataChange() tem um comportamento asynchronous, o que significa que é chamado antes mesmo de você tentar adicionar esses objects da class Score à lista. Com outras palavras, sua list estará sempre vazia fora desse método. Uma solução rápida seria mover a declaração da sua lista dentro de onDataChange() e fazer o que você quer fazer com ela ou, se você quiser mergulhar no mundo asynchronous e usar minha resposta desta postagem .

Supondo que o nó de score seja um subordinado direto de sua raiz do Firebase, para exibir os dados usando a class String, use o seguinte código:

 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference scoreRef = rootRef.child("score"); ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { List list = new ArrayList<>(); for(DataSnapshot ds : dataSnapshot.getChildren()) { String userId = ds.child("userId").getValue(String.class); String score = ds.child("score").getValue(String.class); list.add(userId + " / " + score); Log.d("TAG", userId + " / " + score); } ListView listView = (ListView) findViewById(R.id.list_view); ArrayAdapter arrayAdapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, list); listView.setAdapter(arrayAdapter); } @Override public void onCancelled(DatabaseError databaseError) {} }; scoreRef.addListenerForSingleValueEvent(eventListener); 

E é assim que você pode exibir dados usando a class Score .

 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference scoreRef = rootRef.child("score"); ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { List list = new ArrayList<>(); for(DataSnapshot ds : dataSnapshot.getChildren()) { Score s = ds.getValue(Score.class); String userId = s.getUserId(); String score = s.getScore(); Log.d("TAG", userId + " / " + score); list.add(score); } ListView listView = (ListView) findViewById(R.id.list_view); ArrayAdapter arrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, list); listView.setAdapter(arrayAdapter); } @Override public void onCancelled(DatabaseError databaseError) {} }; scoreRef.addListenerForSingleValueEvent(eventListener); 

filepath.addOnSuccessListener (carregue os dados primeiro), depois pegue e use ….