在我的应用程序中,我有一个植物列表,用户可以插入新的植物,修改和删除它们。
用户可以长按列表中的一个项目来删除它,但是如果其他人从其他设备删除了相同的项目,或者我从数据库中删除了列表没有更新,就像在编辑(该项目保留在列表中,您也可以再次删除它,这是没有意义的。)
以下是我在数据更改时更新项目的方法:
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
删除它?
答案 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) {
}
});