You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio无法解析getRef(int),Firebase数据删除遇阻

解决Firebase删除数据时getRef(int)无法解析的问题

问题原因

getRef(int)是FirebaseUI库中FirebaseRecyclerAdapter的专属方法,你当前使用的是原生RecyclerView.Adapter,所以IDE会提示无法找到该方法。

解决方案

方法一:给User模型类添加key字段存储节点键值

  1. 修改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; }
    }
    
  2. 加载数据时存入节点键
    在读取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) {}
    });
    
  3. 在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中单独维护一个存储节点键的列表:

  1. 在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;
        }
    
        // ... 其他代码不变
    }
    
  2. 加载数据时同步填充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) {}
    });
    
  3. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:10:47