如何在android中使用自定义arrayadapter在listview中使用复选框选中多个项目?

如何在android中使用自定义arrayadapter在listview中使用复选框选中多个项目?,android,checkbox,android-listview,android-arrayadapter,Android,Checkbox,Android Listview,Android Arrayadapter,我有一个复选框和两个标签的列表视图。我为Listview使用了自定义ArrayAdapter类。我使用选中的复选框成功地从listview中删除了项目,但问题是删除多个项目不正确 public class MainActivity extends Activity { ListView listView; Button btnDelete; ArrayList<String> items = new ArrayList<St

我有一个复选框和两个标签的列表视图。我为Listview使用了自定义ArrayAdapter类。我使用选中的复选框成功地从listview中删除了项目,但问题是删除多个项目不正确

  public class MainActivity extends Activity {

        ListView listView;
        Button btnDelete;
        ArrayList<String> items = new ArrayList<String>();
        ArrayList<Integer> ids = new ArrayList<Integer>();
        CustomAdapter adapter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            listView = (ListView) findViewById(R.id.listView1);
            btnDelete = (Button) findViewById(R.id.btnDelete);

            for (int i = 0; i < 20; i++) {
                items.add("Chk " + i);
            }

            adapter = new CustomAdapter(MainActivity.this, R.layout.custome_list,
                    items);
            listView.setAdapter(adapter);

            btnDelete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    if (ids.size() > 0) {
                        for (int i = 0; i < ids.size(); i++) {
                            items.remove(items.get(ids.get(i)));

                        }

                        adapter.notifyDataSetChanged();
                    }
                }
            });
        }

        public class CustomAdapter extends ArrayAdapter<String> {

            List<String> items;
            int resource;

            public CustomAdapter(Context context, int resource, List<String> items) {
                super(context, resource, items);
                this.items = items;
                this.resource = resource;
            }

            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {
                final int pos = position;
                ViewHolder holder = null;
                if (convertView == null) {
                    holder = new ViewHolder();
                    LayoutInflater inflater = getLayoutInflater();

                    convertView = inflater.inflate(resource, null);

                    holder.chk = (CheckBox) convertView.findViewById(R.id.chk);
                    holder.txt = (TextView) convertView.findViewById(R.id.txt);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }

                holder.txt.setText(items.get(position));

                holder.chk
                        .setOnCheckedChangeListener(new OnCheckedChangeListener() {

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

                                if (isChecked) {
                                    ids.add(position);
                                    System.out.println("IDS A: " + ids.toString());
                                } else {
                                    if (ids.contains(position)) {
                                        int i = ids.indexOf(position);
                                        ids.remove(i);
                                        System.out.println("IDS R: "
                                                + ids.toString());
                                    }
                                }

                            }
                        });
                return convertView;
            }
        }

        public class ViewHolder {
            CheckBox chk;
            TextView txt;
        }
    }
公共类MainActivity扩展活动{
列表视图列表视图;
按钮btnDelete;
ArrayList items=新建ArrayList();
ArrayList ID=新的ArrayList();
自定义适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(listView)findViewById(R.id.listView1);
btnDelete=(按钮)findViewById(R.id.btnDelete);
对于(int i=0;i<20;i++){
项目。添加(“Chk”+i);
}
适配器=新的CustomAdapter(MainActivity.this,R.layout.custome_列表,
项目);
setAdapter(适配器);
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(ids.size()>0){
对于(int i=0;i
重用convertView时,必须重新加载检查状态。setOnCheckedChangeListener(null)很重要,因为在设置检查状态时将调用旧的侦听器

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    final int pos = position;

    ViewHolder holder = null;

    if (convertView == null) {
        holder = new ViewHolder();
        LayoutInflater inflater = getLayoutInflater();

        convertView = inflater.inflate(resource, null);

        holder.chk = (CheckBox) convertView.findViewById(R.id.chk);
        holder.txt = (TextView) convertView.findViewById(R.id.txt);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.txt.setText(items.get(position));

    // you have to reload the check states
    holder.chk.setOnCheckedChangeListener(null);
    holder.chk.setChecked(ids.contains(position));

    holder.chk
            .setOnCheckedChangeListener(new OnCheckedChangeListener() {

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

                    if (isChecked) {
                        ids.add(position);
                        System.out.println("IDS A: " + ids.toString());
                    } else {
                        if (ids.contains(position)) {
                            int i = ids.indexOf(position);
                            ids.remove(i);
                            System.out.println("IDS R: "
                                    + ids.toString());
                        }
                    }

                }
            });
    return convertView;
}

我想使用复选框来删除listview项目。有什么区别?当我使用holder.chk.setOnCheckedChangeListener(null)时,可以更改代码的一部分;然后从arraylist中删除多个项目,但不在正确位置删除项目。当我使用复选框从listview中选择CHK1和CHK2时,将保留从listview 2中删除的1和3。是否有其他方法实现此目的?