我正在构建一个列表,该列表包含每个联系人 例如,选择要修改的复选框,问题是 当列表变得比手机屏幕长并且滚动是 积极的;当我选择一个复选框时,第二个会自动 在列表底部选择。
问题是第二个复选框的自动选择; 请让我知道我该如何解决??
下面是我用于 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;
}
}
最佳答案
问题在于列表重用了您的 View (因此在 getView 中使用了 convertView 参数)。 在您的代码中,如果您得到一个不为空的 convertView,则必须将其复选框选中状态更改为与新内容相关的状态。
假设 view1 首先与 id 1 相关联,然后您检查它。 然后,您滚动并将 view1 转换为显示 id 10。但由于未重新创建 View ,它仍将具有 id 1 的项目的复选框状态。
所以基本上解决方案是在某个地方存储哪些项目被选中,在我们的 getView 方法中,您可以这样做
cb.setChecked(isItemChecked(position));
而且你必须执行 isItemChecked(int position);
一个低效但有效的实现是在你的 Activity 中使用一个 bool 数组,比方说
boolean[] itemChecked;
然后在 getView 中,您在选中的复选框上设置了一个监听器(必须将位置设置为 final 才能工作)。您还可以使用数组设置选中状态。
cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
itemChecked[position] = isChecked;
}
});
cb.setChecked(itemChecked[position]);
但同样,为此使用数组可能不是最有效的实现方式,尤其是当您的列表中有大量元素时。
关于android - 自动选择 ListView 内的复选框 - android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703698/