Android 全局变量在侦听器运行时变为null

Android 全局变量在侦听器运行时变为null,android,android-fragments,android-recyclerview,Android,Android Fragments,Android Recyclerview,我尝试发送从活动中获取的日历日期,并通过bundle将其发送到fragment recyclerView,我正确地收到了日期,但当我按下复选框并通过侦听器提醒fragment时,日期值变为null 这是Viewholder代码 private class addStudentViewHolder extends RecyclerView.ViewHolder { private MaterialCheckBox checkBox; private Mate

我尝试发送从活动中获取的日历日期,并通过bundle将其发送到fragment recyclerView,我正确地收到了日期,但当我按下复选框并通过侦听器提醒fragment时,日期值变为null

这是Viewholder代码

    private class addStudentViewHolder extends RecyclerView.ViewHolder {
        private MaterialCheckBox checkBox;
        private MaterialTextView nameTv;
        private int id;
        private List<StudentAttendeesDataModel> models = new ArrayList<>();

        private addStudentViewHolder(View itemView) {
            super(itemView);
            checkBox = itemView.findViewById(R.id.take_attendees);
            nameTv = itemView.findViewById(R.id.person_name);
        }

    private void bind(int position) {
        final StudentDataModel dataModel = dataModels.get(position);
        nameTv.setText(dataModel.getName());
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                id = dataModel.getId();
                Toast.makeText(context, "in" + calendarDate, Toast.LENGTH_SHORT).show();
                if (isChecked) {
                    StudentAttendeesDataModel model = new StudentAttendeesDataModel(id, calendarDate, 1);
                    models.add(model);
                    mListener.onCheckedChanged(models);
                } else {
                    StudentAttendeesDataModel model = new StudentAttendeesDataModel(id, calendarDate, 0);
                    models.remove(model);
                    mListener.onCheckedChanged(models);
                }
            }
        });
    }
}
私有类addStudentViewHolder扩展了RecyclerView.ViewHolder{
私有材料复选框复选框;
私人材料文本视图名称电视;
私有int-id;
私有列表模型=新的ArrayList();
私有addStudentViewHolder(视图项视图){
超级(项目视图);
复选框=itemView.findViewById(R.id.take_与会者);
nameTv=itemView.findviewbyd(R.id.person\u name);
}
私有无效绑定(int位置){
final StudentDataModel dataModel=dataModels.get(位置);
nameTv.setText(dataModel.getName());
setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
id=dataModel.getId();
Toast.makeText(上下文,“in”+日历日期,Toast.LENGTH_SHORT).show();
如果(已检查){
StudentAttendesDataModel=新的StudentAttendesDataModel(id,calendarDate,1);
模型。添加(模型);
mListener.onCheckedChanged(模型);
}否则{
StudentAttendesDataModel=新的StudentAttendesDataModel(id,calendarDate,0);
模型。移除(模型);
mListener.onCheckedChanged(模型);
}
}
});
}
}
这是片段中的代码

   @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Bundle bundle = getArguments();
            if (bundle != null) {
                calendarDate = bundle.getString(DATE_CALENDAR_KEY);
            }
        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_student_recyclerview, container, false);
        RecyclerView recyclerView = v.findViewById(R.id.fragment_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        dataSource = new DataSource(getActivity());
        List<StudentDataModel> dataModels = new ArrayList<>();
        List<StudentAttendeesDataModel> data = dataSource.getStudentAttendenas();
        adapter = new AttendeesAdapter(2, data, getContext(), this);
        adapter.setOnCreateStudentData(dataModels);
        recyclerView.setAdapter(adapter);
        setHasOptionsMenu(true);
        return v;
    }

    @Override
    public void onResume() {
        super.onResume();
        List<StudentDataModel> dataModels = dataSource.getStudent();
        adapter.setStudentData(dataModels);
    }

    @Override
    public void onCheckedChanged(List<StudentAttendeesDataModel> models) {
        this.models = models;
    }
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle=getArguments();
if(bundle!=null){
calendarDate=bundle.getString(日期\日历\键);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图v=充气机。充气(R.layout.fragment\u student\u recyclerview,container,false);
RecyclerView RecyclerView=v.findViewById(R.id.fragment\u RecyclerView);
setLayoutManager(新的LinearLayoutManager(getActivity());
dataSource=新数据源(getActivity());
List dataModels=new ArrayList();
List data=dataSource.getStudentAttendenas();
adapter=new AttendesAdapter(2,数据,getContext(),this);
setOnCreateStudentData(数据模型);
recyclerView.setAdapter(适配器);
设置选项菜单(真);
返回v;
}
@凌驾
恢复时公开作废(){
super.onResume();
List dataModels=dataSource.getStudent();
adapter.setStudentData(数据模型);
}
@凌驾
检查更改后的公共无效(列出模型){
这个。模型=模型;
}
当我尝试将该值放入适配器时,该值正好变为null

  • 更新与会者适配器以在适配器中设置calendarDate,然后在viewholder中使用该值

  • AttendesAdapter(2,data,getContext(),this,calendarDate)

    我通过将变量设为静态来解决问题):

    我使用java而不是Kotlin您应该从onCheckedChanged(…)中的回调中收集它->modelsCan您可以将该值作为参数放入构造函数中,或者在适配器中创建一个变量date,并使用setter方法为其赋值。从活动中调用setter方法来设置值。