Android 复选框如果选中任何项目,则始终选中ListView中的最后一个项目

Android 复选框如果选中任何项目,则始终选中ListView中的最后一个项目,android,listview,checkbox,android-listview,android-checkbox,Android,Listview,Checkbox,Android Listview,Android Checkbox,我有一个列表视图,其中我检查/选择回答问题的项目,并将所选选项放置在自定义数组类(选项)中,并将其传递给确认活动。例如:我的列表视图中有4个选项 Question: What is your favorite color? [] Red [] Green [] Blue [] Yellow (每次选中复选框时,我都会递增全局变量checkCounter。每次取消选中复选框时,checkboxCounter都会递减。) 示例场景: 我选中蓝色和黄色选项并将其提交到下一个活动(确认),此时复选框

我有一个
列表视图
,其中我检查/选择回答问题的项目,并将所选选项放置在自定义数组类(
选项
)中,并将其传递给
确认
活动。例如:我的
列表视图中有4个选项

Question: What is your favorite color?

[] Red
[] Green
[] Blue
[] Yellow
(每次选中复选框时,我都会递增全局变量
checkCounter
。每次取消选中复选框时,
checkboxCounter
都会递减。)

示例场景: 我选中蓝色和黄色选项并将其提交到下一个活动(
确认
),此时
复选框计数器
2,但我想更改我的答案,因此我返回到
回答
活动,但在我的日志中,
复选框计数器
为+1或增加到1。最后一个
checkboxCounter
现在是3,我不知道哪里出错了,或者它是否重用了全局变量
checkboxCounter

这是我的密码:

private class OptionAdapter extends ArrayAdapter<Option>  {
    Context context; 
    int layoutResourceId;    
    OptionHolder holder;
    Option data[] = null;

    public OptionAdapter(Context context, int layoutResourceId, Option[] data) {
        super(context, layoutResourceId, data);
        this.context = context;
        this.layoutResourceId = layoutResourceId;
        this.data = data;
    }

    private class OptionHolder {
        CheckBox optionCheckBox;
        TextView  optionTextView;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
        holder = null;
        final Option optionItem = data[position];

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new OptionHolder();
            row.setTag(holder);
        } else {
            holder = (OptionHolder) row.getTag();
        }

        holder.optionCheckBox   = (CheckBox) row.findViewById(R.id.option_checkbox);
        holder.optionTextView   = (TextView)  row.findViewById(R.id.option_text);

        holder.optionCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView,
                    boolean isChecked) {

                    if(isChecked){
                        checkboxCounter++;
                        optionItem.checkFlag = true;
                    } else{
                        checkboxCounter--;
                        optionItem.checkFlag = false;
                    }
                    arrayOptions[position] = new Option(optionItem.id, optionItem.option, optionItem.questionId, optionItem.questionType, optionItem.checkFlag);
            }
        });

        //This is for the checking when I'm from Confirmation activity
        //If optionItem.checkFlag is true, check the checkbox in this position or index
        //Otherwise, else
        if (optionItem != null) {
            holder.optionTextView.setText(optionItem.option);
            if (optionItem.checkFlag) {
                holder.optionCheckBox.setChecked(true);
            } else {
                holder.optionCheckBox.setChecked(false);
            }
        }

        return row;
    }
}
私有类OptionAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
期权持有人;
选项数据[]=null;
公共选项适配器(上下文上下文、内部布局资源ID、选项[]数据){
超级(上下文、布局资源ID、数据);
this.context=上下文;
this.layoutResourceId=layoutResourceId;
这个数据=数据;
}
私人类别期权持有人{
复选框选项复选框;
文本视图选项文本视图;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行=转换视图;
holder=null;
最终选项optionItem=数据[位置];
if(行==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
持有人=新的期权持有人();
row.setTag(支架);
}否则{
holder=(OptionHolder)行。getTag();
}
holder.optionCheckBox=(复选框)row.findViewById(R.id.option\u复选框);
holder.optionTextView=(TextView)row.findViewById(R.id.option\u text);
holder.optionCheckBox.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,
布尔值(已检查){
如果(已检查){
checkboxCounter++;
optionItem.checkFlag=true;
}否则{
支票箱计数器--;
optionItem.checkFlag=false;
}
arrayOptions[位置]=新选项(optionItem.id、optionItem.Option、optionItem.questionId、optionItem.questionType、optionItem.checkFlag);
}
});
//这是我参加确认活动时的检查
//如果optionItem.checkFlag为true,请选中此位置或索引中的复选框
//否则,否则
if(optionItem!=null){
holder.optionTextView.setText(optionItem.option);
if(optionItem.checkFlag){
holder.optionCheckBox.setChecked(正确);
}否则{
holder.optionCheckBox.setChecked(假);
}
}
返回行;
}
}
注意:
选项适配器
类在我的
答案
活动中。我有一种预感,这导致了这个错误,然而,这只是一种预感。

。查查罗曼盖伊的建议