自动选择listview中的复选框 - android

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)

Jul*_*ien 5

问题是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)

但同样,使用数组可能不是最有效的实现,特别是如果列表中有大量元素.