Mostrar datos de Firebase en ListView

Resuelto coderob asked hace 54 años • 2 respuestas

Bien, lo hice ejecutar mostrando la ID de usuario pero no la puntuación. Luego comencé a hacer algunos cambios, olvidé lo que había cambiado y ahora vuelvo a ser nulo nulo nuevamente. Siento que es posible que haya eliminado algo o haya escrito mal algo.

   dbref.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                ArrayList<String> 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

coderob avatar Jan 01 '70 08:01 coderob
Aceptado

Este es un problema clásico con las API asincrónicas. Para que funcione, cambie la clase de su 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 onDataChange()el método tiene un comportamiento asincrónico, lo que significa que se llama incluso antes de intentar agregar esos objetos de Scoreclase a la lista. En otras palabras, tu listsiempre estará vacío fuera de ese método. Una solución rápida sería mover la declaración de su lista al interior 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 scorenodo es un hijo directo de su raíz de Firebase, para mostrar los datos usando la clase String, use el siguiente código:

ListView listView = (ListView) findViewById(R.id.list_view);
List<String> list = new ArrayList<>();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list);
listView.setAdapter(arrayAdapter);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference scoreRef = rootRef.child("score");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        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);
        }
        arrayAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d(TAG, task.getException().getMessage());
    }
};
scoreRef.addListenerForSingleValueEvent(eventListener);

Y así es como puedes mostrar datos usando la Scoreclase.

ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Score score = ds.getValue(Score.class);
            String userId = score.getUserId();
            String score = score.getScore();
            Log.d("TAG", userId + " / " +  score);
            list.add(score);
        }
        arrayAdapter.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d(TAG, task.getException().getMessage());
    }
};
scoreRef.addListenerForSingleValueEvent(eventListener);
Alex Mamo avatar Feb 05 '2018 13:02 Alex Mamo