android - ListView 中的复选框自动检查最后位置的问题

标签 android listview button checkbox

我正在 ListView 中实现 CheckBox。我面临的问题是,每当我们检查另一个 CheckBox 时,都会自动检查 CheckBox 的最后一个位置。

这是我实现的适配器:

 private class ListAdapter_cb extends BaseAdapter {
    private LayoutInflater inflater;
    private ViewHolder vh;
    CheckboxesPOJO cc = new CheckboxesPOJO();
    List<CheckboxesPOJO> array = new ArrayList<CheckboxesPOJO>();
    boolean[] checkedState;
    private Context context;
    boolean[] checkboolean;
    int pos;
    List<String> answers;
    public ListAdapter_cb(Context c, int early_pos, List<CheckboxesPOJO> arraylist) {
        this.array = arraylist;
        this.context = c;
        this.pos = early_pos;
        checkboolean = new boolean[array.size()];
    }
    @Override
    public View getView(final int position, View convertview, ViewGroup parent) {
        final CheckboxesPOJO obj_bean_downloadplus = array.get(position);
        if (convertview == null) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertview = inflater.inflate(R.layout.element_cb, parent, false);
            vh = new ViewHolder();
            vh.answer_checkbox = (CheckBox) convertview.findViewById(R.id.answer_checkbox);
            convertview.setTag(vh);
        } else {
            vh = (ViewHolder) convertview.getTag();
        }

        vh.answer_checkbox.setText(obj_bean_downloadplus.getItsanswer() + "");
        vh.answer_checkbox.setId(position);
        vh.answer_checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                {
                    if ((buttonView.isChecked())) {
                        vh.answer_checkbox.setChecked(true);
                        checkboolean[position] = true;
                        checkedList.add(obj_bean_downloadplus.getNumber() + ":" + obj_bean_downloadplus.getItsanswer());
                        Log.v("", TAG + "obj_bean_downloadplus >> " + obj_bean_downloadplus.getNumber() + ":" + obj_bean_downloadplus.getItsanswer());
                        Log.v("", TAG + "obj_bean_downloadplus >> " + checkedList.toString());

                    } else {
                        vh.answer_checkbox.setChecked(false);
                        checkboolean[position] = false;
                        checkedList.remove(obj_bean_downloadplus.getNumber() + ":" + obj_bean_downloadplus.getItsanswer());
                        Log.v("", TAG + "obj_bean_downloadplus >> " + obj_bean_downloadplus.getNumber() + ":" + obj_bean_downloadplus.getItsanswer());
                        Log.v("", TAG + "obj_bean_downloadplus >> " +  checkedList.toString());

                    }
                }
            }
        });

        vh.answer_checkbox.setChecked(checkboolean[position]);

        return convertview;
    }

    public int getCount() {
        return array.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
}

这会导致 checkbox 的最后一个位置自动选中,甚至将其答案保存在 checkedlist 中,我只需要发送选中的内容。

///======单选按钮=====// 我在 radio 组中面临同样的问题。 请找到下面的 radio 组适配器:

  private class RadioGroupAdapter extends BaseAdapter {
    List<SubquesPOJO> arraylist_downloadplus = new ArrayList<SubquesPOJO>();
    Context context;
    int layoutResourceId;
    int early_pos;
    List<String> arraylist_downloadplusanswer = new ArrayList<String>();
    String[] ansarray;
    private SparseBooleanArray mSparseBooleanArray_radio;

    public RadioGroupAdapter(Context context, int early_pos, int layoutResourceId, List<SubquesPOJO> arraylist_downloadplus1, List<String> arraylist_downloadplus2) {
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.early_pos = early_pos;
        arraylist_downloadplus.clear();
        arraylist_downloadplusanswer.clear();
        arraylist_downloadplus = arraylist_downloadplus1;
        arraylist_downloadplusanswer = arraylist_downloadplus2;
        ansarray = new String[arraylist_downloadplus.size()];
        mSparseBooleanArray_radio = new SparseBooleanArray();
        Log.v("", TAG + "=arraylist_downloadplus.size()=" + arraylist_downloadplus.size());
    }

    @SuppressLint("ViewHolder")
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final SubquesPOJO obj_bean_downloadplus = arraylist_downloadplus.get(position);
        View row = convertView;
        MatrixHolder holder = null;
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new MatrixHolder();
            holder.txtTitle = (TextView) row.findViewById(R.id.txt_misssion);
            holder.group = (RadioGroup) row.findViewById(R.id.answer_radio_group);
            holder.rb2 = new RadioButton[arraylist_downloadplusanswer.size()];
            for (int j = 0; j < arraylist_downloadplusanswer.size(); j++) {
                holder.rb2[j] = new RadioButton(context);
                RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT);
                params.setMargins(0, 0, 20, 0);
                holder.group.addView(holder.rb2[j], params);
                Log.v("", "=ansarray[position]=" + ansarray[position]);
            }
            row.setTag(holder);
        } else {
            holder = (MatrixHolder) row.getTag();
        }
        holder.txtTitle.setText(obj_bean_downloadplus.getTitle());
        for (int j = 0; j < holder.rb2.length; j++) {
            holder.rb2[j].setText(j + 1 + "");
            holder.rb2[j].setId(j);
            holder.rb2[j].setTag(j + 1);
            holder.rb2[j].setTextColor(getResources().getColor(R.color.text_grey_dark));
            //  holder.rb2[j].setOnCheckedChangeListener(new CheckListner_radio(obj_bean_downloadplus, holder.rb2[j]));
           /* if (obj_bean_downloadplus.isSelected()) {
                holder.rb2[j].setChecked(true);
            } else {
                holder.rb2[j].setChecked(false);
            }*/
            holder.rb2[j].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String ansId = v.getTag().toString();
                    ansarray[position] = "\"" + (position + 1) + ":" + ansId + "\"";
                    Log.v("", "=position:ansId=" + ansarray[position]);
                }
            });
            //  mSparseBooleanArray_radio.put((Integer) holder.rb2[j].getTag(), holder.rb2[j].isChecked());
        }
        return row;
    }

    class CheckListner_radio implements CompoundButton.OnCheckedChangeListener {
        private RadioButton checkbox;
        SubquesPOJO data;

        public CheckListner_radio(SubquesPOJO data, RadioButton checkbox) {
            this.data = data;
            this.checkbox = checkbox;
        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                checkbox.setChecked(true);
                String ansId = buttonView.getTag().toString();
                ansarray[position] = "\"" + (position + 1) + ":" + ansId + "\"";
                Log.v("", "=position:ansId=" + ansarray[position]);
                data.SetIsSelected(true);
            }/* else {
                checkbox.setChecked(false);
                data.SetIsSelected(false);
            }*/
            mSparseBooleanArray_radio.put((Integer) buttonView.getTag(), isChecked);
        }
    }

    @Override
    public int getCount() {
        return arraylist_downloadplus.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
}

有些行被注释了,我已经实现了与复选框相同的功能,但它不起作用。

请帮忙。

最佳答案

private class ListAdapter_cb extends BaseAdapter {
    private LayoutInflater inflater;
    private ViewHolder vh;
    CheckboxesPOJO cc = new CheckboxesPOJO();
    List<CheckboxesPOJO> array = new ArrayList<CheckboxesPOJO>();
    boolean[] checkedState;
    private Context context;
    boolean[] checkboolean;
    private SparseBooleanArray mSparseBooleanArray;
    int pos;
    List<String> answers;
    public ListAdapter_cb(Context c, int early_pos, List<CheckboxesPOJO> arraylist) {
        this.array = arraylist;
        this.context = c;
        this.pos = early_pos;
        mSparseBooleanArray = new SparseBooleanArray();
        checkboolean = new boolean[array.size()];
    }
    @Override
    public View getView(final int position, View convertview, ViewGroup parent) {
        final CheckboxesPOJO obj_bean_downloadplus = array.get(position);
        if (convertview == null) {
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertview = inflater.inflate(R.layout.element_cb, parent, false);
            vh = new ViewHolder();
            vh.answer_checkbox = (CheckBox) convertview.findViewById(R.id.answer_checkbox);
            convertview.setTag(vh);
        } else {
            vh = (ViewHolder) convertview.getTag();
        }

        vh.answer_checkbox.setText(obj_bean_downloadplus.getItsanswer() + "");
        vh.answer_checkbox.setId(position);
        vh.answer_checkbox.setOnCheckedChangeListener(new CheckListener());
vh.answer_checkbox.setTag(position);
        vh.answer_checkbox.setChecked(checkboolean[position]);

        return convertview;
    }

    public ArrayList<CheckboxesPOJO> getCheckedItems() {
        ArrayList<CheckboxesPOJO> mTempArry = new ArrayList<CheckboxesPOJO>();

        for (int i = 0; i < mList.size(); i++) {
            if (mSparseBooleanArray.get(i)) {

                CheckboxesPOJO data = mList.get(i);

                mTempArry.add(data);
            }
        }

        return mTempArry;
    }
    class CheckListener implements OnCheckedChangeListener {

        private CheckBox checkbox;
CheckboxesPOJO data;
        public CheckListener(CheckboxesPOJO data, CheckBox checkbox) {
this.data = data;
            this.checkbox = checkbox;

        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {

            if (isChecked) {
                        checkbox.setChecked(true);
                        checkedList.add(data.getNumber() + ":" + data.getItsanswer());

                        Log.v("", TAG + "data >> " + data.getNumber() + ":" + data.getItsanswer());
                        Log.v("", TAG + "data >> " + checkedList.toString());

                    } else {
                        checkbox.setChecked(false);

                        checkedList.remove(data.getNumber() + ":" + data.getItsanswer());
                        Log.v("", TAG + "data >> " + data.getNumber() + ":" + data.getItsanswer());
                        Log.v("", TAG + "data >> " +  checkedList.toString());

                    }

            mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);
        }

    }

    public int getCount() {
        return array.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
}

关于android - ListView 中的复选框自动检查最后位置的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427432/

相关文章:

android - 如何防止短信进入 Android 中的收件箱?

Android如何通过网络浏览器强制下载文件

Android 库项目 : Refactoring and Navigation

android - 出现错误 - java.lang.UnsupportedOperationException

python - 如何使 python 库 "urwid"的按钮看起来漂亮?

javascript - 单击写入文件时的 html/javascript

java - Java 的 Array clone() 可以返回 null 吗?

android - 在 Android 上,如何在 ListView 中显示 html?

java - 如何将 ListView 保存为文本文档而不是将其加载回程序中

css - 它是如何完成的 - Tweet-Button 计数器的缩放