java - Firebase addChildEventListener 在 ListView android studio 中不起作用
问题描述
我有一个简单的列表视图应用程序和其中的 1 个数据
"1614156499206": {
"title": "This is title",
"description": "This is description",
"date": "24 February 2021",
"timestamp": "1614156499206"
}
这是Java代码
...
TextAdapter textAdapter = new TextAdapter(getContext(), arrayList);
ArrayList<TextHelperClass> arrayList = new ArrayList<>();
TextListView.setAdapter(TextAdapter);
FirebaseDatabase.getInstance().getReference("text").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
for (DataSnapshot timestamp : dataSnapshot.getChildren()) {
TextHelperClass textHelperClass = new TextHelperClass();
String title = timestamp.child("title").getValue(String.class);
String date = timestamp.child("date").getValue(String.class);
String description = timestamp.child("description").getValue(String.class);
String times = timestamp.child("timestamp").getValue(String.class);
textHelperClass.setTitle(title);
textHelperClass.setDate(date);
textHelperClass.setDescription(description);
textHelperClass.setTimestamp(times);
arrayList.add(textHelperClass);
}
textAdapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
textAdapter.notifyDataSetChanged();
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
代码中没有错误,但是当我运行它时,这是输出:
当我将 addChildEventListener 更改为 addValueEventListener 时,它工作正常。当我使用 addChildEventListener 时,我的代码有什么问题?以及每次删除孩子时如何刷新列表视图?
textListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
new AlertDialog.Builder(getActivity(), R.style.AlertDialog)
.setMessage("Are you sure want to delete this text?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String time = arrayList.get(position).getTimestamp();
FirebaseDatabase.getInstance().getReference("text").child(time).removeValue();
}
})
.setNegativeButton("No", null)
.show();
return true;
}
});
解决方案
当您将 a 添加ValueEventListener
到路径时,onDataChange
会立即使用该路径中所有数据的快照调用它。因此,如果该路径下有多个子节点,则需要循环snapshot.getChildren()
访问每个子节点。
将 a 添加ChildEventListener
到同一路径时,onChildAdded
会为每个单独的子节点调用一次。所以你不再需要循环snapshot.getChildren()
。
所以我的猜测是你需要摆脱你的循环onChildAdded
:
FirebaseDatabase.getInstance().getReference("text").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot timestamp, @Nullable String s) {
TextHelperClass textHelperClass = new TextHelperClass();
String title = timestamp.child("title").getValue(String.class);
...
textAdapter.notifyDataSetChanged();
}
推荐阅读
- webrtc - WebRTC:如何让我的系统可靠地为 5.000 到 10.000 个用户进行一对一视频聊天
- javascript - 需要可观察翻译的 Javascript 承诺
- java - 什么是基于 Windows 的 GUI?
- angular - Angular 8 表单控件 Ng If
- hive - 在 HDP 3.1.4 中使用 kafka-handler 4.0
- elasticsearch - 弹性搜索(Kibana) - 布尔结果之间的相交
- python - python无法导入嵌套模块
- c# - 多个字段的 C# 不可变计数器
- c - 使用双指针向结构输入值时出现问题
- node.js - AWS Lambda 从 Windows 机器上创建的 zip 文件访问节点模块