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

