Android Studio无法解析getRef(int),Firebase数据删除遇阻
解决Firebase删除数据时
getRef(int)无法解析的问题 问题原因
getRef(int)是FirebaseUI库中FirebaseRecyclerAdapter的专属方法,你当前使用的是原生RecyclerView.Adapter,所以IDE会提示无法找到该方法。
解决方案
方法一:给User模型类添加key字段存储节点键值
修改User模型类
添加字符串类型的key字段及对应的getter、setter方法:public class User { private String name, chn, shn, phone; private String key; // 新增存储Firebase节点键的字段 // 空构造方法(Firebase序列化需要) public User() {} // 带参数的构造方法 public User(String name, String chn, String shn, String phone) { this.name = name; this.chn = chn; this.shn = shn; this.phone = phone; } // 所有字段的getter和setter public String getName() { return name; } public void setName(String name) { this.name = name; } public String getChn() { return chn; } public void setChn(String chn) { this.chn = chn; } public String getShn() { return shn; } public void setShn(String shn) { this.shn = shn; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } }加载数据时存入节点键
在读取Firebase数据到ArrayList<User>时,通过DataSnapshot.getKey()获取每个节点的键,存入对应的User对象:DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference().child("HostelSwappingDatabase"); dbRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<User> userList = new ArrayList<>(); for (DataSnapshot ds : snapshot.getChildren()) { User user = ds.getValue(User.class); user.setKey(ds.getKey()); // 将节点键存入User对象 userList.add(user); } // 初始化Adapter并设置给RecyclerView RecyclerContactAdapter adapter = new RecyclerContactAdapter(context, userList); recyclerView.setAdapter(adapter); } @Override public void onCancelled(@NonNull DatabaseError error) {} });在Adapter中使用key删除数据
修改onBindViewHolder中的点击事件代码,直接通过User对象的getKey()获取节点键来删除:holder.hostel_optn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String nodeKey = user.getKey(); FirebaseDatabase.getInstance().getReference() .child("HostelSwappingDatabase") .child(nodeKey) .removeValue() .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { // 删除成功后更新本地列表 list.remove(position); notifyItemRemoved(position); } }); } });
方法二:单独维护节点键列表
如果不想修改User模型类,可以在Adapter中单独维护一个存储节点键的列表:
在Adapter中添加key列表
public class RecyclerContactAdapter extends RecyclerView.Adapter<RecyclerContactAdapter.ViewHolder> { Context context; ArrayList<User> list; ArrayList<String> keyList; // 新增存储节点键的列表 // 修改构造方法,传入keyList public RecyclerContactAdapter(Context context, ArrayList<User> list, ArrayList<String> keyList){ this.context = context; this.list = list; this.keyList = keyList; } // ... 其他代码不变 }加载数据时同步填充keyList
dbRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<User> userList = new ArrayList<>(); ArrayList<String> keyList = new ArrayList<>(); for (DataSnapshot ds : snapshot.getChildren()) { User user = ds.getValue(User.class); userList.add(user); keyList.add(ds.getKey()); // 同步存入节点键 } RecyclerContactAdapter adapter = new RecyclerContactAdapter(context, userList, keyList); recyclerView.setAdapter(adapter); } @Override public void onCancelled(@NonNull DatabaseError error) {} });使用keyList删除数据
holder.hostel_optn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String nodeKey = keyList.get(position); FirebaseDatabase.getInstance().getReference() .child("HostelSwappingDatabase") .child(nodeKey) .removeValue() .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { list.remove(position); keyList.remove(position); notifyItemRemoved(position); } }); } });
内容的提问来源于stack exchange,提问作者thebitanpaul
相关产品推荐
相关产品推荐

