使用Firebase检测RecyclerView项目中的删除

时间:2017-04-20 12:20:02

标签: android firebase firebase-realtime-database android-recyclerview

在我的应用程序中,我有一个植物列表,用户可以插入新的植物,修改和删除它们。

用户可以长按列表中的一个项目来删除它,但是如果其他人从其他设备删除了相同的项目,或者我从数据库中删除了列表没有更新,就像在编辑(该项目保留在列表中,您也可以再次删除它,这是没有意义的。)

以下是我在数据更改时更新项目的方法:

PlantViewHolder(View itemView, Context context) {
        super(itemView);
        cardView = (CardView)itemView.findViewById(R.id.cardView);
        plantCommonName = (TextView)itemView.findViewById(R.id.plantCommonName);
        plantScientificName = (TextView)itemView.findViewById(R.id.plantScientificName);
        plantPhoto = (ImageView)itemView.findViewById(R.id.plantPhoto);
        plantCategory = (TextView)itemView.findViewById(R.id.plantCategory);
        plantDescription = (TextView)itemView.findViewById(R.id.plantDescription);
        plantPrice = (TextView)itemView.findViewById(R.id.plantPrice);
        plantStock = (TextView)itemView.findViewById(R.id.plantStock);
        this.context = context;

        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);

        database.getReference().child("plants").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot dss: dataSnapshot.getChildren()) {
                    Plant p0 = dss.getValue(Plant.class);
                    editAt(p0);
                }
            }

            @Override
            public void onCancelled(DatabaseError error) {
                Log.w("Failed to read value.", error.toException());
            }
        });
    }

以下是方法:

private void editAt(Plant p0) {
    for(int i = 0; i < plants.size(); i++) {
        if(plants.get(i).getID() == p0.getID()) {
            plants.get(i).setCommonName(p0.getCommonName());
            plants.get(i).setScientificName(p0.getScientificName());
            plants.get(i).setPrice(p0.getPrice());
            plants.get(i).setStock(p0.getStock());
            plants.get(i).setSeason(p0.getSeason());
            plants.get(i).setDescription(p0.getDescription());

            notifyItemRangeChanged(i, plants.size());
        }
    }
}

正如您所看到的,我只是修改List中的特定项,但我不知道如何在数据库侦听器中区分或实现删除。 如何检测项目是否已从数据库中删除并使用ValueEventListener删除它?

2 个答案:

答案 0 :(得分:1)

您无需使用<script> // Maintain array of dates var dates = new Array(); function addDate(date) { if (jQuery.inArray(date, dates) < 0) dates.push(date); } function removeDate(index) { dates.splice(index, 1); } // Adds a date if we don't have it yet, else remove it function addOrRemoveDate(date) { var index = jQuery.inArray(date, dates); if (index >= 0) removeDate(index); else addDate(date); } // Takes a 1-digit number and inserts a zero before it function padNumber(number) { var ret = new String(number); if (ret.length == 1) ret = "0" + ret; return ret; } jQuery(function () { jQuery("#datepicker").datepicker({ onSelect: function (dateText, inst) { addOrRemoveDate(dateText); }, beforeShowDay: function (date) { var year = date.getFullYear(); // months and days are inserted into the array in the form, e.g "01/01/2009", but here the format is "1/1/2009" var month = padNumber(date.getMonth() + 1); var day = padNumber(date.getDate()); // This depends on the datepicker's date format var dateString = month + "/" + day + "/" + year; var gotDate = jQuery.inArray(dateString, dates); if (gotDate >= 0) { // Enable date so it can be deselected. Set style to be highlighted return [true, "ui-state-highlight"]; } // Dates not in the array are left enabled, but with no extra style return [true, ""]; } }); }); </script> 删除值。只需找到您的ValueEventListener,然后使用reference方法即可。假设您有一个名为removeValue()的节点,请使用以下代码:

Plants

其中yourReference.child("Plants").child(plantId).removeValue(); 是您要删除的特定工厂。

如果您想验证某个项目是否存在,请使用plantId,然后使用reference方法SanpShop

希望它有所帮助。

答案 1 :(得分:0)

我通过从onChildRemoved获取快照并在列表中检查此ID是否在此快照中来解决此问题。

database.getReference().child("plants").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                Plant p0 = dataSnapshot.getValue(Plant.class);
                editAt(p0);
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                Plant p0 = dataSnapshot.getValue(Plant.class);
                for(int i = 0; i < plants.size(); i++) {
                    if(plants.get(i).getID() == p0.getID()) {
                        plants.remove(i);
                        notifyItemRemoved(i);
                        notifyItemRangeChanged(i, plants.size());
                    }
                }
            }

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

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });