在 ListView 中显示 Firebase 数据
开发人员面临的一个常见挑战与在 ListView 中显示 Firebase 中的数据有关。最近,一位用户发布了有关此主题的问题,突出显示了遇到的问题。让我们深入了解他们的担忧并提供解决方案。
问题
他们的代码最初显示用户 ID,但未能显示分数。进行一些更改后,它们留下了空值。由于怀疑存在删除或拼写错误问题,他们寻求帮助。
解决问题
在检查提供的代码后,问题源于未遵循模型中的 Java 命名约定班级。该类应命名为“Score”,格式如下:
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() 方法的异步性质导致列表保持为空。为了解决这个问题,应该将列表声明移到 onDataChange() 内部。
异步行为和数据检索
了解 onDataChange() 的异步行为非常重要方法。在这种情况下,甚至在尝试将对象添加到列表之前就会调用它。因此,任何在该方法之外使用列表的尝试都将产生空结果。
为了解决此行为,可以将列表声明移动到 onDataChange() 内部,如以下代码所示:
dbref.addValueEventListener(new com.google.firebase.database.ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { ArrayList<String> list = new ArrayList<>(); 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); }
使用 String 类显示数据
要使用 String 类显示数据,可以使用以下代码代码:
ListView listView = findViewById(R.id.list_view); List<String> list = new ArrayList<>(); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(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 类显示数据
或者,要使用 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);
按照这些解决方案,您应该能够在 ListView 中成功显示 Firebase 数据。
以上是如何在 Android ListView 中高效显示 Firebase 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!