ListView での Firebase データの表示
開発者が直面する一般的な課題の 1 つは、ListView での Firebase のデータの表示に関するものです。最近、ユーザーがこのトピックに関する質問を投稿し、発生した問題を強調しました。彼らの懸念事項を詳しく掘り下げて、解決策を提供しましょう。
問題
彼らのコードでは、最初はユーザー ID が表示されていましたが、スコアは表示されませんでした。いくつかの変更を加えると、Null 値が残されました。削除またはスペルミスの問題を疑い、彼らは支援を求めました。
問題の解決
提供されたコードを確認したところ、問題はモデル内の 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);
これらの解決策に従うことで、Firebase データを ListView に正常に表示できるはずです。
以上がAndroid ListView で Firebase データを効率的に表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。