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

Fragment中RecyclerView条目TextView设为按钮触发空指针问题求助

问题原因

你遇到的空指针异常核心原因是控件查找范围错误:btn_approve_status和btn_reject_status是RecyclerView子条目布局list_item_status_admin.xml里的控件,不属于Fragment的根布局fragment_pending_req_admin.xml,你直接用Fragment的根View调用findViewById必然找不到,返回null,后续调用setOnClickListener就触发空指针。

修复步骤
  • 第一步:修改pendingViewHolder类,新增两个按钮的成员变量,在构造方法中完成查找:
private class pendingViewHolder extends RecyclerView.ViewHolder
{
    TextView p_reason;
    TextView p_name;
    TextView p_selectLeave;
    TextView p_leaveType;
    TextView p_fromDate;
    TextView p_toDate;
    // 新增两个按钮成员
    TextView btnApprove;
    TextView btnReject;

    public pendingViewHolder(@NonNull  View itemView) {
        super(itemView);
        p_reason = itemView.findViewById(R.id.txt_reason_status);
        p_name = itemView.findViewById(R.id.txt_name_status);
        p_selectLeave = itemView.findViewById(R.id.txt_selectLeave_status);
        p_leaveType = itemView.findViewById(R.id.txt_leaveType_status);
        p_fromDate = itemView.findViewById(R.id.txt_fromDate_status);
        p_toDate = itemView.findViewById(R.id.txt_toDate_status);
        // 从条目View中查找按钮
        btnApprove = itemView.findViewById(R.id.btn_approve_status);
        btnReject = itemView.findViewById(R.id.btn_reject_status);
    }
}
  • 第二步:删除Fragment类中声明的全局Btn_Approve_Status、Btn_Reject_Status变量,同时删除onCreateView中对这两个变量的findViewById赋值代码
  • 第三步:修改onBindViewHolder中的点击事件设置逻辑,使用ViewHolder里的按钮实例:
@Override
protected void onBindViewHolder(@NonNull  pending_req_admin.pendingViewHolder holder, int position, @NonNull  Model model) {
    holder.p_reason.setText(model.getU_reason());
    holder.p_name.setText(model.getU_nameL());
    holder.p_selectLeave.setText(model.getU_select_leave());
    holder.p_leaveType.setText(model.getU_leave_type());
    holder.p_fromDate.setText(model.getU_from_date());
    holder.p_toDate.setText(model.getU_to_date());

    // 用holder里的按钮设置点击事件
    holder.btnApprove.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(), "Leave Request Approved", Toast.LENGTH_SHORT).show();
            Intent openSecondActivity = new Intent(pending_req_admin.this.getContext(), UserLeave.class);
            // 如果需要传递当前条目的数据,可直接用当前的model对象传值
            startActivity(openSecondActivity);
        }
    });

    holder.btnReject.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getActivity(), "Leave Request Rejected", Toast.LENGTH_SHORT).show();
            Intent openSecondActivity = new Intent(pending_req_admin.this.getContext(), Home.class);
            startActivity(openSecondActivity);
        }
    });
}
额外注意事项
  • 你当前构造的Firestore查询存在逻辑问题:db.collection("users").document().collection("ApplyLeave") 中document()无参数会生成随机文档ID,无法查询到对应数据,需要替换为db.collection("users").document(UserId).collection("ApplyLeave")才能查询到当前用户的请假申请数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:30:02