我正在构建一个列表,列表包含每个联系人a 复选框,以选择修改哪一个,例如,问题是 当列表变得比电话屏幕更长并且滚动时 活性;当我选中一个复选框时,第二个是自动的 在列表的底部选择。
问题是第二个复选框的自动选择; 请让我知道如何解决它?
下面是我用于getView方法的代码
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;
}
}
答案 0 :(得分:5)
问题是列表重用了你的视图(因此getView中的convertView参数)。 在您的代码中,如果您获得非null的convertView,则必须将其复选框选中状态更改为与新内容相关的状态。
假设view1首先与id 1关联,然后检查它。 然后,滚动并将view1转换为显示ID 10.但由于未重新创建视图,因此它仍将具有ID为1的项目的复选框状态。
所以基本上解决方案是存储选择了哪些项目,并且在我们的getView方法中,你会这样做
cb.setChecked(isItemChecked(position));
你必须实现isItemChecked(int position);
一个低效但有效的实现方法是在你的活动中使用一个布尔数组,假设
boolean[] itemChecked;
然后在getView中,在复选框上设置一个监听器(必须为此设置最终位置)。您还可以使用数组设置检查状态。
cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
itemChecked[position] = isChecked;
}
});
cb.setChecked(itemChecked[position]);
但是,再次使用数组可能不是最有效的实现,特别是如果列表中有大量元素。
答案 1 :(得分:0)
你也可以使用SparseBooleanArray,它允许你使用列表位置作为键
答案 2 :(得分:0)
适合我的工作
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;
}
答案 3 :(得分:0)
这对我来说是最好的解决方案。 Checkbox auto call onCheckedChange when listview scroll?