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的主要内容,如果未能解决你的问题,请参考以下文章
从 Fabric 链接到 Firebase 后,Firebase 控制台中未显示崩溃