首页 > 解决方案 > RecyclerView 中的复选框无法正常工作

问题描述

我正在使用 RecyclerView 显示保存在我的 Firebase 数据库中的活动列表。我在活动视图的布局中添加了一个复选框,以便用户可以选择是否要将此活动添加到他们的审计配置文件中。

当用户单击复选框以选择活动时,我想将此活动添加到他们的配置文件(存储在单独的表中)并更新原始活动表中的一个字段以说明它现在包含在审计配置文件中。当他们取消选中该框时,它会从他们的个人资料中删除,并且原始活动会更新以反映这一点。

但是,当我尝试这样做时,我的复选框开始表现不正确(例如选中的复选框肯定没有被用户单击,复选框没有保持选中状态)。仅当我同时拥有将活动添加到配置文件并更新原始活动的代码时才会发生这种情况。

有任何想法吗?我认为这可能与状态有关,但我不确定如何去做。

我的代码如下

 auditAdapter = new FirestoreRecyclerAdapter<Activity, AuditBuilder.AuditViewHolder>(auditBuilder) {
        @Override
        protected void onBindViewHolder(@NonNull final AuditBuilder.AuditViewHolder auditViewHolder, int i, @NonNull final Activity activity) {

            auditViewHolder.aAuditActivityName.setText(activity.getActivity_Name());
            auditViewHolder.aAuditActivityType.setText(activity.getActivity_Type());
            auditViewHolder.aAuditActivityDate.setText(activity.getActivity_Date());

            final String docId = auditAdapter.getSnapshots().getSnapshot(i).getId();

            auditViewHolder.auditCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked){

                        //ADD DOCUMENT ID TO DATABASE
                        DocumentReference documentReference = fStore.collection("audits")
                                .document(user.getUid())
                                .collection("myAuditActivities")
                                .document(docId);


                        Map<String, Object> audit = new HashMap<>();

                        audit.put("Activity_ID", docId);
                        audit.put("Activity_Name", activity.getActivity_Name());
                        audit.put("Activity_Description", activity.getActivity_Description());
                        audit.put("Activity_Type", activity.getActivity_Type());
                        audit.put("Activity_Date", activity.getActivity_Date());
                        audit.put("Activity_Hours", activity.getActivity_Hours());
                        audit.put("Activity_Mins", activity.getActivity_Mins());
                        audit.put("Activity_Ref1", activity.getActivity_Ref1());
                        audit.put("Activity_Ref2", activity.getActivity_Ref2());
                        audit.put("Activity_Ref3", activity.getActivity_Ref3());
                        audit.put("Activity_Ref4", activity.getActivity_Ref4());
                        audit.put("Image_URL", activity.getImage_URL());
                        audit.put("In_Audit", true);

                        documentReference.set(audit).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d("TAG", "Activity successfully added to audit");
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(AuditBuilder.this, "Error, try again", Toast.LENGTH_SHORT).show();
                            }
                        });


                        //UPDATE BOOLEAN IN_AUDIT IN CPD ACTIVITIES LOCATION IN DATABASE TO TRUE
                        DocumentReference updateActivity = fStore.collection("cpdActivities")
                                .document(user.getUid())
                                .collection("myCPD")
                                .document(docId);

                        Map<String, Object> updateBoolean = new HashMap<>();
                        updateBoolean.put("In_Audit", true);

                        updateActivity.update(updateBoolean).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d("TAG", "In_Audit successfully updated");
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.d("TAG", "In_Audit update failed");
                            }
                        });

                    } else {
                        //CHECKBOX UNCHECKED, DELETES FROM AUDIT TABLE
                        DocumentReference docRef = fStore.collection("audits")
                                .document(user.getUid())
                                .collection("myAuditActivities")
                                .document(docId);
                        docRef.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d("TAG", "Activity successfully removed from audit");
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(AuditBuilder.this, "Error, try again", Toast.LENGTH_SHORT).show();
                            }
                        });


                        //UPDATE BOOLEAN IN_AUDIT IN CPD ACTIVITIES LOCATION IN DATABASE BACK TO FALSE
                        DocumentReference updateActivity = fStore.collection("cpdActivities")
                                .document(user.getUid())
                                .collection("myCPD")
                                .document(docId);

                        Map<String, Object> updateBoolean = new HashMap<>();
                        updateBoolean.put("In_Audit", false);

                        updateActivity.update(updateBoolean).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Log.d("TAG", "In_Audit successfully updated");
                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Log.d("TAG", "In_Audit update failed");
                            }
                        });


                    }
                }
            });


            auditViewHolder.view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(v.getContext(), ActivityDetails.class);
                    //DISPLAYS ALL THE ATTRIBUTES OF THE ACTIVITY
                    i.putExtra("Activity_Name", activity.getActivity_Name());
                    i.putExtra("Activity_Description", activity.getActivity_Description());
                    i.putExtra("Activity_Type", activity.getActivity_Type());
                    i.putExtra("Activity_Date", activity.getActivity_Date());
                    i.putExtra("Activity_Hours", activity.getActivity_Hours());
                    i.putExtra("Activity_Mins", activity.getActivity_Mins());
                    i.putExtra("Activity_Ref1", activity.getActivity_Ref1());
                    i.putExtra("Activity_Ref2", activity.getActivity_Ref2());
                    i.putExtra("Activity_Ref3", activity.getActivity_Ref3());
                    i.putExtra("Activity_Ref4", activity.getActivity_Ref4());
                    i.putExtra("Image_URL", activity.getImage_URL());
                    i.putExtra("Activity_ID", docId);
                    v.getContext().startActivity(i);
                }
            });



        }

        @NonNull
        @Override
        public AuditBuilder.AuditViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.auditbuilder_view_layout, parent,false);
            return new AuditViewHolder(view);
        }
    };

为了尝试解决这个问题,我在我的模型中添加了一个布尔值 (In_Audit),如下所示:

public class Activity {
private String Activity_Name; 
etc
private boolean In_Audit;

public Activity(String name, String date, String hours, String minutes, String description, String ref1, String ref2, String ref3, String ref4, String type, String image_URL, boolean In_Audit){
    this.Activity_Name = Activity_Name;
    this.Activity_Date = Activity_Date;
    this.Activity_Hours = Activity_Hours;
    this.Activity_Mins = Activity_Mins;
    this.Activity_Description = Activity_Description;
    this.Activity_Ref1 = Activity_Ref1;
    this.Activity_Ref2 = Activity_Ref2;
    this.Activity_Ref3 = Activity_Ref3;
    this.Activity_Ref4 = Activity_Ref4;
    this.Activity_Type = Activity_Type;
    this.Image_URL = Image_URL;
    this.In_Audit = false;
}


public boolean isIn_Audit() {
    return In_Audit;
}

public void setIn_Audit(boolean in_Audit) {
    In_Audit = in_Audit;
}

}

然后我像这样在我的 onBindViewHolder 中引用了这个

auditAdapter = new FirestoreRecyclerAdapter<Activity, AuditBuilder.AuditViewHolder>(auditBuilder) {
        @Override
        protected void onBindViewHolder(@NonNull final AuditBuilder.AuditViewHolder auditViewHolder, int i, @NonNull final Activity activity) {

            auditViewHolder.aAuditActivityName.setText(activity.getActivity_Name());
            auditViewHolder.aAuditActivityType.setText(activity.getActivity_Type());
            auditViewHolder.aAuditActivityDate.setText(activity.getActivity_Date());
            auditViewHolder.auditCheckBox.setSelected(activity.isIn_Audit());

            final String docId = auditAdapter.getSnapshots().getSnapshot(i).getId();




            auditViewHolder.auditCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked){
                        activity.setIn_Audit(true);

                    } else {
                        activity.setIn_Audit(false);}});
                     

但是我的复选框仍然有错误,例如没有滚动,我检查了我的第一个复选框并且它没有保持点击状态。但是,我不能 100% 确定我是否正确应用了上述逻辑。

标签: javaandroidcheckboxandroid-recyclerview

解决方案


推荐阅读