Android Can';t从recyclerview实时数据库中删除项目
我正在尝试设置一种方法从firebase Realtime数据库中永久删除一个项目,但由于某些原因,我不断收到一个错误,该错误表示“getRef”不存在,尽管许多人使用相同的方法删除项目,但我尝试阅读并尝试了多篇文章中的解决方案,但它并没有真正起作用,这是我的适配器类代码,其中错误为:Android Can';t从recyclerview实时数据库中删除项目,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我正在尝试设置一种方法从firebase Realtime数据库中永久删除一个项目,但由于某些原因,我不断收到一个错误,该错误表示“getRef”不存在,尽管许多人使用相同的方法删除项目,但我尝试阅读并尝试了多篇文章中的解决方案,但它并没有真正起作用,这是我的适配器类代码,其中错误为: public class AdminAdapterCalories extends RecyclerView.Adapter<AdminAdapterCalories.MYViewHolder> {
public class AdminAdapterCalories extends RecyclerView.Adapter<AdminAdapterCalories.MYViewHolder> {
ArrayList<Calories> nlist;
public AdminAdapterCalories(ArrayList<Calories> nlist){
this.nlist=nlist;
}
@NonNull
@Override
public MYViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.admin_card_calorie,parent,false);
return new MYViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MYViewHolder holder, int position) {
holder.food.setText(nlist.get(position).getName());
holder.calories.setText("Calories : "+nlist.get(position).getCalories());
holder.proteins.setText("Proteins : "+nlist.get(position).getProteins());
Picasso.get().load(nlist.get(position).getImage()).into(holder.imge);
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder=new AlertDialog.Builder(holder.imge.getContext());
builder.setTitle("Delete Panel");
builder.setMessage("Are You Sure You Want To Delete?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
FirebaseDatabase.getInstance().getReference().child("Food")
.child(getRef(position).getkey()).removeValue();
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.show();
}
});
}
@Override
public int getItemCount() {
return nlist.size();
}
class MYViewHolder extends RecyclerView.ViewHolder {
TextView food,calories,proteins;
ImageView imge,edit,delete;
public MYViewHolder(@NonNull View itemView) {
super(itemView);
food= itemView.findViewById(R.id.food_card_admn);
calories=itemView.findViewById(R.id.caloiries_admin);
proteins=itemView.findViewById(R.id.proteins_admin);
imge=itemView.findViewById(R.id.profile_image_card_admin);
delete=(ImageView)itemView.findViewById(R.id.IvD);
}
}
}
这就是数据库的外观
这就是我生成id的方式
您需要在
carries
中使用成员变量存储项目ID,并为其创建getter和setter
public class Calories {
private String id;
public String getId() {return id;}
public String setId(String id) {this.id = id;}
//....
然后在RecyclerView
中选择需要删除的项目时,获取该项目的id,如:
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String id = nlist.get(position).getId();
FirebaseDatabase.getInstance().getReference().child("Food")
.child(id).removeValue();
}
});
更新:
当您在firebase控制台上手动设置键时,您可以随时使用ValueEventListener从firebase抓取食物列表
并使用getKey()
方法获取每个项目的密钥:
List<Calories> caloryList = new ArrayList();
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
String id = singleSnapshot.getKey();
Calories calory = singleSnapshot.getValue(Calories.class);
calory.setId(id);
caloryList.add(calory);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Food");
ref.addValueEventListener(valueEventListener);
List caloryList=new ArrayList();
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
对于(DataSnapshot singleSnapshot:DataSnapshot.getChildren()){
String id=singleSnapshot.getKey();
卡路里calory=singleSnapshot.getValue(carries.class);
计算setId(id);
caloryList.add(calory);
}
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child(“食物”);
参考addValueEventListener(valueEventListener);
最后,caloryList
应该传递给RecyclerView
适配器。您能分享更多错误跟踪吗?因此,不清楚抛出的异常是什么。@除我在执行之前得到错误外,没有其他错误:无法解析方法'getRef'getResf()不是预定义的方法。您只需传递“key”即可删除。@johnh我如何传递它?每当我搜索密钥时,他们总是使用getref来获取@AndroidLearner您是否将密钥作为成员变量存储在Carries
类中?我尝试过这样做,当我尝试删除java.lang.NullPointerException时,他们给了我以下错误:无法为child()中的参数“pathString”传递nullcom.google.firebase.database.DatabaseReference.child(DatabaseReference.java:96)net.smallacademy.authenticatorapp.adminaptercalories$1.onClick(adminaptercalories.java:55)
@john这意味着id
为null
,您是否在nlist
中的对象上设置了id。。这也应该映射到相应的firebase数据库不,我没有,因为id不是edittext或它没有名字,比如卡路里蛋白质等,所以我不知道如何在firebase上生成这些id,比如01
,02
?当您这样做时,您需要将它们设置为卡路里
对象,然后再将它们保存到firebase中database@john例如,您可以尝试使用FirebaseDatabase.getInstance().getReference().child(“食物”).child(“01”).removeValue()代码>然后检查firebase控制台上是否删除了此项目
//First get key before store data in database.
String key = mDatabaseRef.child("Food").push().getKey();
//store this key in model class for later use.(delete)
yourModelClass.setMyKey(key);
yourModelClass.set(allOtherValues);
//then store in database.
mDatabase.child("Food").child(key).setValue(yourModelClass);
//then delete data using "key".
FirebaseDatabase.getInstance().getReference().child("Food")
.child(yourModelClass.getMyKey()).removeValue();
//getMyKey() is just getter method returns stored key.
//First get key before store data in database.
String key = mDatabaseRef.child("Food").push().getKey();
//store this key in model class for later use.(delete)
yourModelClass.setMyKey(key);
yourModelClass.set(allOtherValues);
//then store in database.
mDatabase.child("Food").child(key).setValue(yourModelClass);
//then delete data using "key".
FirebaseDatabase.getInstance().getReference().child("Food")
.child(yourModelClass.getMyKey()).removeValue();
//getMyKey() is just getter method returns stored key.