通过Android应用程序中的适配器回收视图后,禁用复选框启用

时间:2017-05-10 13:44:15

标签: android

我有以下问题。我在我的应用程序中设置了三个复选框,所以当我检查其中一个时,其他两个被禁用。问题是,当我向上或向下滚动时,即当视图被回收时,一些禁用的复选框被启用,这当然我不想发生。你能帮我解决一下这个问题吗?

适配器中的代码是:

    @NonNull
    @Override
    public View getView(final int position1, View convertView1, ViewGroup parent1) {

        View listItemView1 = convertView1;

        if (listItemView1 == null) {
            listItemView1 = LayoutInflater.from(getContext()).inflate(R.layout.list_item1, parent1, false);
        }

        final ColorQuiz currentColorQuiz = getItem(position1);

        TextView questionTextView = (TextView) listItemView1.findViewById(question_text_view);
        questionTextView.setText(currentColorQuiz.getQuestionHeader());

        final CheckBox box1 = (CheckBox) listItemView1.findViewById(R.id.check_Box_view1);
        box1.setText(currentColorQuiz.getCheckBoxTextA());

        final CheckBox box2 = (CheckBox) listItemView1.findViewById(R.id.check_Box_view2);
        box2.setText(currentColorQuiz.getCheckBoxTextB());

        final CheckBox box3 = (CheckBox) listItemView1.findViewById(R.id.check_Box_view3);
        box3.setText(currentColorQuiz.getCheckBoxTextC());


        box1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                if (box1.isChecked() ) {
                    thesisA[position1]=true;
                    box2.setEnabled(false);
                    box3.setEnabled(false);
                    } else {
                    thesisA[position1]=false;
                    box2.setEnabled(true);
                    box3.setEnabled(true);
                    }
                int getPositionA = (Integer) compoundButton.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                colorQuizs.get(getPositionA).setSelectedA(compoundButton.isChecked());


            }
        });
        box1.setTag(position1);
        box1.setChecked(colorQuizs.get(position1).isSelectedA());

。 。 。 并继续使用下两个复选框(box2,box3)。

1 个答案:

答案 0 :(得分:1)

可能在您调用box1.setChecked时,会调用其中一个侦听器,这会导致问题(因为它仍然有旧标记,并且可能会为您的模型设置错误的数据)。

尝试在开始时添加以确保不会发生错误:

    box1.setOnCheckedChangeListener(null);
    box2.setOnCheckedChangeListener(null);
    box3.setOnCheckedChangeListener(null);

这将告诉您如果在属性未更改时未调用回调是此问题的原因:

    box1.setChecked(!colorQuizs.get(position1).isSelectedA()); 
    box1.setChecked(colorQuizs.get(position1).isSelectedA());