在 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中文網其他相關文章!