首頁 > Java > java教程 > 如何在 Android ListView 中高效率顯示 Firebase 資料?

如何在 Android ListView 中高效率顯示 Firebase 資料?

Mary-Kate Olsen
發布: 2024-12-09 21:26:15
原創
216 人瀏覽過

How to Efficiently Display Firebase Data in an Android ListView?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板