在ListView中显示Firebase数据
好的,所以我让它运行显示用户ID但没有得分。 然后我开始做一些改变,忘了我改变了什么,现在我又回到了null null。 我觉得我可能删除了一些东西或拼写错误的东西。
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); }
这是我的模特:
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 + '\'' + '}'; } }
数据库: 链接到我的数据库截图
这是异步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类显示数据,请使用以下代码:
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);
以及如何使用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(先上传数据)然后得到它并使用它….