首页 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板