listview内部复选框的自动选择-android
我正在建立一个列表,该列表包含每个联系人的 复选框选择要修改的选项例如,问题是 当列表长度超过手机屏幕时,滚动被取消 忙碌的当我选中一个复选框时,会自动显示第二个复选框 在列表底部选中 问题是自动选择第二个复选框; 请让我知道如何修复它 下面是我用于getView方法的代码listview内部复选框的自动选择-android,android,listview,checkbox,scroll,Android,Listview,Checkbox,Scroll,我正在建立一个列表,该列表包含每个联系人的 复选框选择要修改的选项例如,问题是 当列表长度超过手机屏幕时,滚动被取消 忙碌的当我选中一个复选框时,会自动显示第二个复选框 在列表底部选中 问题是自动选择第二个复选框; 请让我知道如何修复它 下面是我用于getView方法的代码 public View getView(int position, View converView, ViewGroup parent){ View row = converView; if(row =
public View getView(int position, View converView, ViewGroup parent){
View row = converView;
if(row == null){
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.edit, parent, false);
}
TextView label = (TextView)row.findViewById(R.id.label);
label.setText(items[position]);
CheckBox cb = (CheckBox)row.findViewById(R.id.del);
ImageView icon = (ImageView)row.findViewById(R.id.icon);
icon.setImageResource(images.get(position));
Log.i("Pos", ""+position);
return row;
}
}
问题是列表重用了视图(因此getView中的convertView参数)。 在代码中,如果您得到的convertView不为null,则必须将其复选框选中状态更改为与新内容相关的状态 假设view1首先与id 1关联,然后检查它。 然后,滚动并将view1转换为显示id 10。但由于未重新创建视图,因此它仍将具有id为1的项的复选框状态 因此,基本上解决方案是将选定的项目存储在某个位置,在我们的getView方法中,您可以这样做
cb.setChecked(isItemChecked(position));
您必须实现isItemChecked(int位置)
比如说,一个低效但有效的实现是在活动中使用布尔数组
boolean[] itemChecked;
然后在getView中,您将侦听器设置为选中复选框(必须使位置为最终位置才能工作)。还可以使用数组设置选中状态
cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
itemChecked[position] = isChecked;
}
});
cb.setChecked(itemChecked[position]);
但同样,使用数组来实现这一点可能不是最有效的实现,尤其是当列表中有大量元素时。问题是列表重用了视图(因此getView中的convertView参数)。 在代码中,如果您得到的convertView不为null,则必须将其复选框选中状态更改为与新内容相关的状态 假设view1首先与id 1关联,然后检查它。 然后,滚动并将view1转换为显示id 10。但由于未重新创建视图,因此它仍将具有id为1的项的复选框状态 因此,基本上解决方案是将选定的项目存储在某个位置,在我们的getView方法中,您可以这样做
cb.setChecked(isItemChecked(position));
您必须实现isItemChecked(int位置)
比如说,一个低效但有效的实现是在活动中使用布尔数组
boolean[] itemChecked;
然后在getView中,您将侦听器设置为选中复选框(必须使位置为最终位置才能工作)。还可以使用数组设置选中状态
cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
itemChecked[position] = isChecked;
}
});
cb.setChecked(itemChecked[position]);
但是,使用数组来实现这一点可能不是最有效的实现,尤其是当列表中有大量元素时。yy您还可以使用SparseBooleanArray,它允许您将列表位置用作键yy您还可以使用SparseBooleanArray,它允许您将列表位置用作键对我来说很好
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
final ViewHolder holder;
final Season season = (Season) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.season, parent, false);
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.season_title);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.season_check_box);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(season.getTitle());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
season.setChecked(isChecked);
adapter.notifyDataSetChanged();
}
});
holder.checkBox.setChecked(season.isChecked()); // position is important! Must be before return statement!
return convertView;
}
protected class ViewHolder {
protected TextView title;
protected CheckBox checkBox;
}
对我来说很好
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
final ViewHolder holder;
final Season season = (Season) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.season, parent, false);
holder = new ViewHolder();
holder.title = (TextView) convertView.findViewById(R.id.season_title);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.season_check_box);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.title.setText(season.getTitle());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
season.setChecked(isChecked);
adapter.notifyDataSetChanged();
}
});
holder.checkBox.setChecked(season.isChecked()); // position is important! Must be before return statement!
return convertView;
}
protected class ViewHolder {
protected TextView title;
protected CheckBox checkBox;
}
这对我来说是最好的解决办法。
这对我来说是最好的解决方案。
非常感谢朱利安,它成功了,我只改变了一件事,我改变了布尔值;to boolean itemChecked[]=new boolean[100];因为它给了我空指针异常…非常感谢Julien,它起作用了,我只是改变了一件事,我改变了boolean[]itemChecked;to boolean itemChecked[]=new boolean[100];因为它给了我空指针异常。。。