如何在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
相关产品推荐
相关产品推荐

