如何从 ListView 中删除一个项目并在 Firebase 上删除它?

Posted

技术标签:

【中文标题】如何从 ListView 中删除一个项目并在 Firebase 上删除它?【英文标题】:How to delete an item from ListView and also delete it on Firebase? 【发布时间】:2020-11-14 06:05:59 【问题描述】:

我的问题是,如果我尝试删除我的 ListView 上的一个项目,所有数据都将被删除到 listview 和我的 firebase 实时数据库上。我想要的是,如果我长按一个项目,只会删除该项目,而不是ListView 上的所有项目。谢谢你。任何帮助表示赞赏

这是我声明的:

 MatkulAdapter matkulAdapter = null;
 Matkul matkul;
 DatabaseReference root = FirebaseDatabase.getInstance().getReference();
 DatabaseReference dbReference = root.child("MataKuliah");

这是删除项目的代码:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
                    Matkul item = matkulAdapter.getItem(position);
                    matkulAdapter.remove(item);
                    dbReference.removeValue();
                    matkulAdapter.notifyDataSetChanged();
     return true;
                
            );

这是我的数据库:

This is my database

编辑问题

我也用 .child 尝试了这段代码,但数据只在 ListView 上删除。因此,当我重新打开 ListView 时,数据会返回。

   listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() 
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
                Matkul item = matkulAdapter.getItem(position);
                matkulAdapter.remove(item);
                dbReference.child(item.getNamaMatkul()).removeValue();
                matkulAdapter.notifyDataSetChanged();

【问题讨论】:

【参考方案1】:

您需要在第二个孩子中传递您的 Firebase 项目 ID (15955880552231),如下代码:

Query query = rdbReference.orderByChild("namaMatkul").equalTo(item.namaMatkul);
query.addListenerForSingleValueEvent(new ValueEventListener() 
@Override
public void onDataChange(DataSnapshot dataSnapshot) 
    for (DataSnapshot itemSnapshot: dataSnapshot.getChildren()) 
        appleSnapshot.getRef().removeValue();
        matkulAdapter.remove(item);
        matkulAdapter.notifyDataSetChanged();
    


@Override
public void onCancelled(DatabaseError databaseError) 
    Log.e(TAG, "onCancelled", databaseError.toException());
);

【讨论】:

谢谢先生,但是很抱歉,如何获取 firebaseItemID?我该如何申报? 使用点击监听器中的代码查找特定项目 非常感谢先生!该代码正在运行,但有一个小错误,如果我删除一个项目,它将更改为其他数据或数据将加倍,但是当我先返回然后再次打开它时,它会从列表视图中消失。非常感谢先生 这只是sn-p,需要自己开发逻辑;)【参考方案2】:

当您使用以下代码行时:

dbReference.removeValue();

MataKuliah 下的所有内容都将被删除。如果只需要删除1595588052231 孩子,那么只需使用以下代码行:

dbReference.child("1595588052231").removeValue();

更好的方法可能是将1595588052231 作为uid 属性的值存储在数据库中,然后使用:

dbReference.child(item.getUid()).removeValue();

【讨论】:

谢谢先生,但是如果我想删除 MataKuliah 上的随机项目怎么办?我尝试此代码dbReference.child(item.getUid()).removeValue(); 但在 getUid() 上出现错误 您有一个错误,因为您应该在 Matkul 类中添加一个名为 uid 的新属性和相应的 getUid() getter。在您的1595588052231 节点下的数据库中,您还应该拥有应该拥有相同1595588052231 值的uid 属性。然后一切都会正常工作。如需随机取值,请查看this 我已经在Matkul 上添加了private String uid 并获取了getUid(),但是得到了这个错误Can't pass null for argument 'pathString' in child() 发生这种情况是因为您尝试从数据库中获取的值确实存在。正如我之前所说,您还应该将其添加到数据库中。所以你有namaDosennamaMaktul,加上uid,其值为1595588052231

以上是关于如何从 ListView 中删除一个项目并在 Firebase 上删除它?的主要内容,如果未能解决你的问题,请参考以下文章

如何从android的listview中删除一个项目

如何从 ListView 中删除项目而不从数据库中删除它?

如何从 Xamarin Forms ListView 中删除项目?

Android:如何从 listView 和 arrayAdapter 中删除项目

从 ListView.builder Flutter 中删除项目

如何在 ListView 中添加/删除项目?