在 ListView 中显示 Firebase 数据

Posted

技术标签:

【中文标题】在 ListView 中显示 Firebase 数据【英文标题】:Showing Firebase data in ListView 【发布时间】:2018-07-15 07:17:36 【问题描述】:

好的,所以我让它运行显示用户 ID 但不显示分数。然后我开始做一些改变,忘记了我改变了什么,现在我又回到了 null null 。我觉得我可能删除了某些内容或拼错了某些内容。

   dbref.addValueEventListener(new com.google.firebase.database.ValueEventListener() 
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) 

                ArrayList<String> list = new ArrayList<>();
                list.clear();

                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);
            

这是我的模型:

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 + '\'' +
            '';

 

数据库: Link to my database screenshot

【问题讨论】:

你能把你的“logcat print for when crash发生吗?通常是红色文本。LogCat在Android Studio的底部或View > Tool Windows > LogCat logcat 崩溃时没有写入任何内容,我通过底部导航栏导航到片段。当我单击按钮时,应用程序会停止,logcat 没有说明原因。 这是一种奇怪的行为。您正在使用模拟器或移动连接与 Android Studio 对吗?如果是,也许您需要更改 logcat 中的过滤器。在您看到“仅显示选定的应用程序”的地方放置“无过滤器”并在第三个下拉菜单上选择详细。 您的 logcat 中的错误是什么? 参见上面的编辑,应用程序不再崩溃,只是说 null:null 。 【参考方案1】:

这是异步 API 的一个经典问题。为了使其工作,请根据Java Naming Conventions 更改您的模型类。你的类应该是这样的:

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() 方法具有异步行为,这意味着即使在您尝试将Score 类的那些对象添加到列表之前,它也会被调用。换句话说,您的 list 在该方法之外将始终为空。一个快速的解决方法是将列表的声明移到 onDataChange() 中并做你想做的事情,或者,如果你想深入异步世界并使用我在 post 中的回答。

假设 score 节点是 Firebase 根的直接子节点,要使用 String 类显示数据,请使用以下代码:

ListView listView = (ListView) findViewById(R.id.list_view);
List<String> list = new ArrayList<>();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(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 类显示数据的方式。

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);

【讨论】:

您是否在onDataChange() 方法中创建列表并将适配器设置在同一个位置? @AlexMamo 是的,除了 Listview LvRanking 之外,所有内容都在该方法中;和 LvRanking = ...(R.id.LvRanking); @AlexMamo 现在编辑并添加了数据库截图。非常感谢您的帮助 不正确。您没有更改模型类,正确命名字段很重要。请参阅here 在哪里设置适配器。 @AlexMamo 我不太清楚你的意思.. 我只使用 Android 大约一个月。我将尝试实现您发送的链接。谢谢【参考方案2】:

filepath.addOnSuccessListener(先上传数据)然后获取并使用....

【讨论】:

以上是关于在 ListView 中显示 Firebase 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 ListView 中显示 Firebase 数据

在 ListView 中显示 Firebase 数据

使用 firebase 在 listview 中显示所有用户图像

Firebase Android ListView 未显示

Firebase Android ListView 未显示

无法从 Firebase 将数据显示为 ListView