Отображение данных Firebase в ListView
Хорошо, я запустил его, показывая идентификатор пользователя, но не оценку. Затем я начал вносить некоторые изменения, забыл, что я изменил, и теперь я снова возвращаюсь к null null. Мне кажется, что я что-то удалил или написал с ошибкой.
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);
}
Вот моя модель:
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 + '\'' +
'}';
}
}
База данных:
Ссылка на скриншот моей базы данных
Переведено автоматически
Ответ 1
Это классическая проблема с асинхронными API. Чтобы заставить его работать, измените свой класс модели в соответствии с соглашениями об именовании Java. Ваш класс должен выглядеть следующим образом:
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 + '\'' +
'}';
}
}
Также обратите внимание, что onDataChange()
метод имеет асинхронное поведение, что означает, что он вызывается еще до того, как вы пытаетесь добавить эти объекты Score
класса в список. Другими словами, ваш list
всегда будет пустым вне этого метода. Быстрым решением было бы переместить объявление вашего списка внутрь onDataChange()
и делать с ним то, что вы хотите, или, если вы хотите погрузиться в асинхронный мир и использовать мой ответ из этого поста.
Предполагая, что score
узел является прямым дочерним элементом вашего корня Firebase, для отображения данных с использованием класса String, пожалуйста, используйте следующий код:
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);
И вот как вы можете отображать данные с помощью Score
класса.
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);
Ответ 2
путь к файлу.addOnSuccessListener (сначала загрузите данные), затем получите их и используйте....