Mostrar datos de Firebase en ListView

De acuerdo, lo hice funcionar mostrando la identificación de usuario pero no la puntuación. Luego comencé a hacer algunos cambios, olvidé lo que había cambiado y ahora vuelvo a null null nuevamente. Siento que puedo haber borrado algo o algo mal escrito.

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

Aquí está mi 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 + '\'' + '}'; } } 

Base de datos: Enlace a la captura de pantalla de mi base de datos

Este es un problema clásico con las API asincrónicas. Para que funcione, cambie su clase de modelo de acuerdo con las Convenciones de nomenclatura de Java . Tu clase debería verse así:

 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 + '\'' + '}'; } } 

También tenga en cuenta que el método onDataChange() tiene un comportamiento asíncrono, lo que significa que se llama incluso antes de intentar agregar esos objetos de Score clase Score a la lista. En otras palabras, tu list siempre estará vacía fuera de ese método. Una solución rápida sería mover la statement de su lista dentro de onDataChange() y hacer lo que quiera con ella o, si desea sumergirse en el mundo asincrónico y usar mi respuesta de esta publicación .

Suponiendo que el nodo de score es un elemento directo de su raíz de Firebase, para mostrar los datos usando la clase String, use el siguiente 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); 

Y de esta forma puedes mostrar datos usando Score clase 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 (carga datos primero) luego obténgalo y úselo …