首页 > Java > java教程 > 为什么在 ListView 中显示 Firebase 数据时得到空值?

为什么在 ListView 中显示 Firebase 数据时得到空值?

Mary-Kate Olsen
发布: 2025-01-03 00:51:38
原创
270 人浏览过

Why Am I Getting Null Values When Displaying Firebase Data in a ListView?

在 ListView 中显示 Firebase 数据:对空值进行故障排除

尝试在 ListView 中显示 Firebase 数据时,尝试检索时可能会出现问题具体值。如果您在尝试显示用户 ID 和分数时遇到空值,则必须仔细检查您的代码并确保其遵循最佳实践。

模型类的 Java 命名约定

影响正确检索数据的一个关键因素是遵守模型类的 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() 方法Firebase 中的数据检索具有异步性质。这意味着甚至在您尝试将检索到的对象(类型为 Score)添加到列表之前就会调用它。因此,如果您在 onDataChange() 方法之外访问它,您的列表可能会保持为空。

修改数据检索代码

假设“score”节点是Firebase 根目录的直接子级,您可以按如下方式修改数据检索代码:

使用字符串Class

ListView 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 Class

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 数据,检索用户 ID 和分数均符合预期。

以上是为什么在 ListView 中显示 Firebase 数据时得到空值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板