Firebase - 显示到 ListView

Posted

技术标签:

【中文标题】Firebase - 显示到 ListView【英文标题】:Firebase - Display to ListView 【发布时间】:2020-11-03 22:53:29 【问题描述】:

我有存储在 firebase 上的数据,其中有一个电影 id 作为孩子,其中包含电影名称。我想在 ListView 中显示存储在 firebase 上的电影名称。我遇到的问题是我不确定如何只获取电影名称的数据,而不是包括用户在内的所有数据。我也在从一个活动上传数据,并希望将其显示在 ListView 内的另一个活动中。

上传到 Firebase

String filmID = filmDetails.getString("film_id");
String filmName = filmDetails.getString("film_name");
DatabaseReference currentUserDBR = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);

if (currentUserID != null) 

currentUserDBR.orderByChild(filmID).addListenerForSingleValueEvent(new ValueEventListener() 
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) 
        String fbFilmID = snapshot.getValue().toString();
        if (fbFilmID.contains(filmID))  // If film already exists Remove it on click
            btnSaved.setText("Add to List");
            currentUserDBR.child(filmID).removeValue();
            Toast.makeText(getApplicationContext(), "Removed from Films List", Toast.LENGTH_SHORT).show();
         else  // If film does not exist add it on click
            btnSaved.setText("Remove");
            currentUserDBR.child(filmID).child("Film Name").setValue(filmName);
            Toast.makeText(getApplicationContext(), "Saved to Films List", Toast.LENGTH_SHORT).show();
            overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
        
    

显示到 ListView

DatabaseReference filmsReference = FirebaseDatabase.getInstance().getReference( "Users");
lvSavedFilms = findViewById(R.id.lv_display_saved_films);
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, R.layout.listitem, R.id.lv_text_color, filmName);
lvSavedFilms.setAdapter(arrayAdapter);

ChildEventListener childEventListener = filmsReference.addChildEventListener(new ChildEventListener() 
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 
/*                GenericTypeIndicator<HashMap<String, Object>> genericTypeIndicator = new GenericTypeIndicator<HashMap<String, Object>>() 
                ;
                HashMap<String, Object> hmFilmName = snapshot.getValue(genericTypeIndicator);*/
                String value = snapshot.getValue().toString();
                filmName.add(value);

                arrayAdapter.notifyDataSetChanged();
            

            @Override
            public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 

            

            @Override
            public void onChildRemoved(@NonNull DataSnapshot snapshot) 
                arrayAdapter.remove(arrayAdapter.getItem(filmName.indexOf(snapshot.getValue(String.class))));
                arrayAdapter.notifyDataSetChanged();
            

            @Override
            public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 

            

            @Override
            public void onCancelled(@NonNull DatabaseError error) 

            

        );

我尝试了String value = snapshot.getValue(String.class);,但我收到一个错误,说它无法将 HashMap 转换为字符串。

【问题讨论】:

您在这里分享了两个完整的听众。哪一个在您的第二个屏幕截图中显示输出? 这些行:String value = snapshot.getValue().toString(); filmName.add(value); 在“显示到列表视图”代码中正在执行第二张图片中的输出 那么filmsReference是什么? 我很遗憾我错过了我现在添加它。是这样的:DatabaseReference filmsReference = FirebaseDatabase.getInstance().getReference( "Users"); 【参考方案1】:

由于filmsReference 指向数据库中的Users 节点,因此您在onChildAdded 中获得的snapshot 包含nfx... 节点的所有数据。

要到达实际的电影节点,您必须遍历 `snapshot 的子节点:

filmsReference.addChildEventListener(new ChildEventListener() 
    @Override
    public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) 
        for (DataSnapshot filmSnapshot: snapshot.getChildren()) 
            String value = filmSnapshot.child("Film Name").getValue(String.class);
            filmName.add(value);
        

【讨论】:

感谢您的编辑。那是复制/粘贴/忘记修改:)

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

将 Firebase 图像显示到数组中

从 Fabric 链接到 Firebase 后,Firebase 控制台中未显示崩溃

图像加载和上传到 Firebase 存储无法在 android 和 firebase 控制台中显示“错误加载预览”

将图像从 firebase 显示到颤振应用程序 [关闭]

尝试显示从 Firebase 到 MapKit 的位置数据

尝试从firebase数据库显示图像到tableview [重复]