Waq*_*qar 1 checkbox android listview scroll
我正在构建一个列表,列表中包含每个联系人的复选框,以选择要修改哪一个,例如,问题是当列表变得比电话屏幕更长并且滚动处于活动状态时; 当我选中一个复选框时,会在列表底部自动选择第二个复选框.
问题是自动选择第二个复选框; 请让我知道我该如何解决?
下面是我用于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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是list重用了你的视图(因此getView中的convertView参数).在您的代码中,如果您获得非null的convertView,则必须将其复选框选中状态更改为与新内容相关的状态.
假设view1首先与id 1关联,然后检查它.然后,滚动并将view1转换为显示ID 10.但由于未重新创建视图,因此它仍将具有ID为1的项目的复选框状态.
因此,基本上解决方案是存储选择哪些项目的地方,并且在我们的getView方法中,您可以这样做
cb.setChecked(isItemChecked(position));
Run Code Online (Sandbox Code Playgroud)
你必须实现isItemChecked(int position);
一个低效但有效的实现是在你的活动中使用一个布尔数组,比如说
boolean[] itemChecked;
Run Code Online (Sandbox Code Playgroud)
然后在getView中,在复选框上设置一个监听器(必须为此设置最终位置才能工作).您还可以使用数组设置检查状态.
cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
itemChecked[position] = isChecked;
}
});
cb.setChecked(itemChecked[position]);
Run Code Online (Sandbox Code Playgroud)
但同样,使用数组可能不是最有效的实现,特别是如果列表中有大量元素.
归档时间: |
|
查看次数: |
4025 次 |
最近记录: |