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

如何在FireRecyclerAdapter中通过按钮获取列表用户UID并设置Firebase封禁状态

问题分析

你当前的实现存在错误,核心问题有两点:

  • 全局声明的uid变量取的是当前APP登录账号的UID,这会导致你点击任意列表项的按钮,操作的都是自己账号的封禁状态,完全无法实现对列表用户的状态设置
  • 按钮点击事件写在了ViewHolder的构造方法中,此时列表项还未绑定对应数据,没有办法拿到当前项对应的用户UID
调整步骤

按照以下步骤修改代码即可实现需求:

1. 修改Adapter的ViewHolder类

把两个操作按钮声明为成员变量,移除构造方法内的点击事件设置,修正拼写错误的参数类型:

class myViewHolder extends RecyclerView.ViewHolder {
    CircleImageView image;
    TextView name, address, phoneNum;
    Button blockBtn, unblockBtn; // 新增两个按钮的成员声明,移除没用的ToggleButton

    public myViewHolder(@NonNull View itemView) { // 原来的ViewItem是拼写错误,修正为View
        super(itemView);
        image = itemView.findViewById(R.id.img1);
        name = itemView.findViewById(R.id.nameText);
        address = itemView.findViewById(R.id.addressText);
        phoneNum = itemView.findViewById(R.id.numberText);
        // 仅获取按钮实例,点击事件后续绑定数据时设置
        blockBtn = itemView.findViewById(R.id.button3);
        unblockBtn = itemView.findViewById(R.id.button4);
    }
}

2. 修改onBindViewHolder方法

绑定数据时拿到当前列表项对应的用户UID,给按钮设置点击事件:

@Override
protected void onBindViewHolder(@NonNull myViewHolder holder, int position, @NonNull MainData model) {
    holder.name.setText(model.getName());
    holder.address.setText(model.getAddress());
    holder.phoneNum.setText(model.getPhoneNum());
    // 获取当前列表项对应用户的UID(即Users节点下的子节点key)
    String targetUserUid = getRef(position).getKey();
    // 给按钮绑定点击事件,传入目标用户UID
    holder.blockBtn.setOnClickListener(v -> blockUser(targetUserUid));
    holder.unblockBtn.setOnClickListener(v -> unblockUser(targetUserUid));
}

3. 修改blockUser和unblockUser方法

接收目标用户UID作为参数,替换原来使用的全局当前登录用户UID:

private void blockUser(String targetUserUid) {
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Blocked Users").child(targetUserUid);
    reference.setValue(1)
            .addOnCompleteListener(unused -> Toast.makeText(context, "用户已封禁", Toast.LENGTH_SHORT).show())
            .addOnFailureListener(e -> Toast.makeText(context, "操作失败:"+e.getMessage(),Toast.LENGTH_SHORT).show());
}

private void unblockUser(String targetUserUid){
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Blocked Users").child(targetUserUid);
    reference.setValue(0)
            .addOnCompleteListener(unused -> Toast.makeText(context, "用户已解封", Toast.LENGTH_SHORT).show())
            .addOnFailureListener(e -> Toast.makeText(context, "操作失败:"+e.getMessage(),Toast.LENGTH_SHORT).show());
}

4. 修复Context空指针问题

给Adapter添加构造参数传入Context,避免Toast调用时出现空指针:
首先修改Adapter的构造方法:

private Context context;
public MainAdapter(@NonNull FirebaseRecyclerOptions<MainData> mainDataFirebaseRecyclerOptions, Context context) {
    super(mainDataFirebaseRecyclerOptions);
    this.context = context;
}

然后在Report Activity中初始化Adapter时传入Context:

mainAdapter = new MainAdapter(mainDataFirebaseRecyclerOptions, this);

内容的提问来源于stack exchange,提问作者Rafael Campos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:54:05