Firebase从RecyclerView适配器中删除子项

时间:2018-03-07 21:41:51

标签: android firebase android-recyclerview

我需要在RecyclerView适配器 onClick 后从Firebase中删除子项。

我有这样的事情:

public void onBindViewHolder(final ViewHolder holder, final int position) {
  holder.fromTextView.setText(my_data.get(position).getFromName());

  holder.fromTextView.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View view) {
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference messageRef = database.getReference();
    final DatabaseReference mess = messageRef.child("notifications").child(toId.toString());

    mess.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //Code for delete?
        }
   }
  }

}

Firebase数据库: Firebase Database Android RecyclerView: Android Recycler View

点击商品后,我需要将其从Firebase数据库中删除。 我只需要删除一个孩子。

感谢。

3 个答案:

答案 0 :(得分:0)

为了删除Firebase数据库记录,您不需要使用监听器,您只需要在引用上直接使用removeValue()方法,如下所示:

messageRef.child("notifications").child(toId.toString()).removeValue();

答案 1 :(得分:0)

用户removeValue方法并添加监听器以了解删除操作的状态,如下所示。完整示例http://www.zoftino.com/firebase-realtime-database-android-example#realtime-database-delete

FirebaseDatabase.getInstance().getReference()
                .child("notifications").child(toId.toString()).removeValue()
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            Log.d("Delete", "Notification has been deleted");
                        } else {
                            Log.d("Delete", "Notification couldn't be deleted");
                        }
                    }
                });

答案 2 :(得分:0)

回顾:

假设您有一个数据库引用负责获取名为 mDatabase 的项目的整个列表,您应该已经对其进行了初始化:

private DatabaseReference mDatabase;

在您的活动主要方法中:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
mDatabase = FirebaseDatabase.getInstance().getReference();

并以以下方式获取数据:

  mDatabase = FirebaseDatabase.getInstance().getReference()
            .child("myitems").child(someKey);

现在您的数据正在显示在“回收者”视图中,在某些时候,我们将使用mDatabase成功删除以下项目:

在您的ViewHolder中:

您必须首先从ViewHolder中获取项目位置的引用,而ViewHolder直接从数据库中引用该项目:

假设您的数据库引用为 itemRef

最终数据库参考** itemRef **

您必须使用getRef将数据库引用分配给每个项目的位置:

final DatabaseReference itemRef = getRef(position);

然后在使用对您的位置和数据库引用的引用后,将其分配给一个String,您将使用它来获取项目的唯一键:

final String myKey = itemRef.getKey();//you can name the myKey whatever you want.

最后,我们可以访问删除项的键:

在此示例中:假设您的删除按钮为:delBtn,并且您的ViewHolder为 GameViewHolder viewHolder,如下所示

@Override
protected void onBindViewHolder(@NonNull GameViewHolder viewHolder,int position,
@NonNull final Game model)

删除项目:

在您的ViewHolder /引用viewHolder ...中,我们在按钮上设置了一个点钟监听器,并使用我们数据库的所有项目参考来获取特定项目的位置并删除值:

viewHolder.delBtn.setOnClickListener(v -> {
mDatabase.child(myKey).removeValue();

因此,我们整个删除的商品代码如下:

@NonNull
@Override
public GameViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
return new GameViewHolder(inflater.inflate(R.layout.single_item, viewGroup, false));}

@Override
protected void onBindViewHolder(@NonNull GameViewHolder viewHolder,int position,
@NonNull final Game model){
final DatabaseReference itemRef = getRef(position);              
final String myKey = itemRef.getKey();//you can name the myKey whatever you want.


 viewHolder.delBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
  mDatabase.child(myKey).removeValue();

                    }
                });

More details from this blog

Firebase Official Documents