android - 自动选择 ListView 内的复选框 - android

标签 android listview checkbox 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;   
  } 
}

最佳答案

问题在于列表重用了您的 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/

相关文章:

java - 如何计算 map 跨度/缩放以在视口(viewport)中包含一组 GeoPoints?

android - MPAndroidChart : Change Shape of Bar Chart

android - 在 Android 中使用 OpenCV 检测图像中的圆圈

java - Android:无法获得可点击的 ListView 页眉/页脚

java - 令人困惑的复选框问题

Django DetailView - 将模型中的 bool 值显示为复选框

Android 职责分离示例

Android - 滚动 ListView 会导致越界异常

wpf - WPF GridViewItem 控件的默认前景色是什么?

php - 更新 mySQL 数据库时出现问题