首页 > 解决方案 > 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;
    }
});

标签: javaandroidfirebasefirebase-realtime-database

解决方案


当您将 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();
    }

推荐阅读