如何在android中使用自定义arrayadapter在listview中使用复选框选中多个项目?
我有一个复选框和两个标签的列表视图。我为Listview使用了自定义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
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。是否有其他方法实现此目的?