从 RecyclerAdapter 上的 firebase 中删除数据

Posted

技术标签:

【中文标题】从 RecyclerAdapter 上的 firebase 中删除数据【英文标题】:Removing data from firebase on a RecyclerAdapter 【发布时间】:2018-10-10 03:13:47 【问题描述】:

我正在删除 RecyclerViewAdapter 上带有 PopupMenu 的列表项,但是当该项目被删除时,它仍保留在 Firebase 上。

这是在 RecyclerAdapter 的 onBindViewHolder 上

holder.opcionesButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            //creating a popup menu
            PopupMenu popup = new PopupMenu(context, holder.opcionesButton);
            //inflating menu from xml resource
            popup.inflate(R.menu.menu_edit);
            //adding click listener
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() 
                @Override
                public boolean onMenuItemClick(MenuItem item) 
                    switch (item.getItemId()) 
                        case R.id.edit_item:
                            //handle menu1 click
                            break;
                        case R.id.delete_item:

                            tareasList.remove(position);
                            notifyItemRemoved(position);
                            Toast.makeText(context, "Tareas eliminada!", Toast.LENGTH_SHORT).show();
                            break;

                    
                    return false;
                
            );
            //displaying the popup
            popup.show();
        
    );

这是在 MainFragment 上

  final Query tareasQuery = mTareasDatabase.child(userId);
        tareasQuery.addChildEventListener(new ChildEventListener() 

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) 
                Tareas tareas = new Tareas();
                tareas.setFecha(dataSnapshot.getValue(Tareas.class).getFecha());
                tareas.setDescripcion(dataSnapshot.getValue(Tareas.class).getDescripcion());
                tareas.setLista(dataSnapshot.getValue(Tareas.class).getLista());
                tareas.setPrioridad(dataSnapshot.getValue(Tareas.class).getPrioridad());
                mTareasList.add(tareas);
                mTareasAdapter.notifyDataSetChanged();

            

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) 
                String tareasId = dataSnapshot.getValue(Tareas.class).getTareasId();
                mTareasDatabase.child(userId).child(tareasId).removeValue();
            

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) 
                String tareasId = dataSnapshot.getValue(Tareas.class).getTareasId();
                mTareasDatabase.child(userId).child(tareasId).removeValue();

            

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) 

            

            @Override
            public void onCancelled(DatabaseError databaseError) 

            
        );

一切正常,除了没有从 firebase 中删除它

解决方案

同时从 firebase 和 recycler 视图中删除该项目

case R.id.delete_item:
                            FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
                            String tareasId = tareas.getTareasId();
                            final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            String userId = user.getUid();
                            DatabaseReference databaseReference = firebaseDatabase.getReference("Tareas")
                                    .child(userId).child(tareasId);
                            databaseReference.removeValue();

                            tareasList.remove(position);
                            notifyItemRemoved(position);
                            Toast.makeText(context, "Tareas eliminada!", Toast.LENGTH_SHORT).show();
                            break;

【问题讨论】:

【参考方案1】:

好的,我解决了。我只需要在删除项上添加所有数据库引用,并同时将其从回收器视图和数据库中删除

 case R.id.delete_item:
                            FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
                            String tareasId = tareas.getTareasId();
                            final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            String userId = user.getUid();
                            DatabaseReference databaseReference = firebaseDatabase.getReference("Tareas")
                                    .child(userId).child(tareasId);
                            databaseReference.removeValue();

                            tareasList.remove(position);
                            notifyItemRemoved(position);
                            Toast.makeText(context, "Tareas eliminada!", Toast.LENGTH_SHORT).show();
                            break;

【讨论】:

如果你有更好的方法,请发帖【参考方案2】:

这是因为您只从本地列表中删除。您也必须从 firebase 中删除该值。用于删除使用代码

firebaseRef.removeValue();

在您的 firebaseRef 中,您必须显示要删除的值。

【讨论】:

以上是关于从 RecyclerAdapter 上的 firebase 中删除数据的主要内容,如果未能解决你的问题,请参考以下文章

历史上的今天:IBM 获得了第一项专利;Verizon 收购雅虎;亚马逊发布 Fire Phone...

如何使用 Parse LiveQuery for Android 自动将新对象添加到我的 RecyclerAdapter?

从 Fire Storage 检索图像,但是如果图像不存在,则应用程序崩溃

历史上的今天7 月 25 日:IBM 获得了第一项专利;Verizon 收购雅虎;亚马逊发布 Fire Phone

kindle fire 上的应用开发都有哪些限制?

ios 11.2.x 上的 ionic cordova 中的 Fire click 事件不起作用