listview内部复选框的自动选择-android

listview内部复选框的自动选择-android,android,listview,checkbox,scroll,Android,Listview,Checkbox,Scroll,我正在建立一个列表,该列表包含每个联系人的 复选框选择要修改的选项例如,问题是 当列表长度超过手机屏幕时,滚动被取消 忙碌的当我选中一个复选框时,会自动显示第二个复选框 在列表底部选中 问题是自动选择第二个复选框; 请让我知道如何修复它 下面是我用于getView方法的代码 public View getView(int position, View converView, ViewGroup parent){ View row = converView; if(row =

我正在建立一个列表,该列表包含每个联系人的 复选框选择要修改的选项例如,问题是 当列表长度超过手机屏幕时,滚动被取消 忙碌的当我选中一个复选框时,会自动显示第二个复选框 在列表底部选中

问题是自动选择第二个复选框; 请让我知道如何修复它

下面是我用于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;   
  } 
}

问题是列表重用了视图(因此getView中的convertView参数)。 在代码中,如果您得到的convertView不为null,则必须将其复选框选中状态更改为与新内容相关的状态

假设view1首先与id 1关联,然后检查它。 然后,滚动并将view1转换为显示id 10。但由于未重新创建视图,因此它仍将具有id为1的项的复选框状态

因此,基本上解决方案是将选定的项目存储在某个位置,在我们的getView方法中,您可以这样做

cb.setChecked(isItemChecked(position));
您必须实现isItemChecked(int位置)

比如说,一个低效但有效的实现是在活动中使用布尔数组

boolean[] itemChecked;
然后在getView中,您将侦听器设置为选中复选框(必须使位置为最终位置才能工作)。还可以使用数组设置选中状态

cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
  public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
    itemChecked[position] = isChecked;
  }
});

cb.setChecked(itemChecked[position]);

但同样,使用数组来实现这一点可能不是最有效的实现,尤其是当列表中有大量元素时。

问题是列表重用了视图(因此getView中的convertView参数)。 在代码中,如果您得到的convertView不为null,则必须将其复选框选中状态更改为与新内容相关的状态

假设view1首先与id 1关联,然后检查它。 然后,滚动并将view1转换为显示id 10。但由于未重新创建视图,因此它仍将具有id为1的项的复选框状态

因此,基本上解决方案是将选定的项目存储在某个位置,在我们的getView方法中,您可以这样做

cb.setChecked(isItemChecked(position));
您必须实现isItemChecked(int位置)

比如说,一个低效但有效的实现是在活动中使用布尔数组

boolean[] itemChecked;
然后在getView中,您将侦听器设置为选中复选框(必须使位置为最终位置才能工作)。还可以使用数组设置选中状态

cb.setOnCheckedChangeListener (new OnCheckedChangeListener () {
  public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
    itemChecked[position] = isChecked;
  }
});

cb.setChecked(itemChecked[position]);

但是,使用数组来实现这一点可能不是最有效的实现,尤其是当列表中有大量元素时。

yy您还可以使用SparseBooleanArray,它允许您将列表位置用作键

yy您还可以使用SparseBooleanArray,它允许您将列表位置用作键

对我来说很好

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;
    }
对我来说很好

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;
    }

这对我来说是最好的解决办法。
这对我来说是最好的解决方案。

非常感谢朱利安,它成功了,我只改变了一件事,我改变了布尔值;to boolean itemChecked[]=new boolean[100];因为它给了我空指针异常…非常感谢Julien,它起作用了,我只是改变了一件事,我改变了boolean[]itemChecked;to boolean itemChecked[]=new boolean[100];因为它给了我空指针异常。。。