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

时间:2010-09-13 19:29:20

标签: android listview checkbox scroll

我正在构建一个列表,列表包含每个联系人a 复选框,以选择修改哪一个,例如,问题是 当列表变得比电话屏幕更长并且滚动时 活性;当我选中一个复选框时,第二个是自动的 在列表的底部选择。

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

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

4 个答案:

答案 0 :(得分:5)

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

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

所以基本上解决方案是存储选择了哪些项目,并且在我们的getView方法中,你会这样做

cb.setChecked(isItemChecked(position));

你必须实现isItemChecked(int position);

一个低效但有效的实现方法是在你的活动中使用一个布尔数组,假设

boolean[] itemChecked;

然后在getView中,在复选框上设置一个监听器(必须为此设置最终位置)。您还可以使用数组设置检查状态。

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

cb.setChecked(itemChecked[position]);

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

答案 1 :(得分:0)

你也可以使用SparseBooleanArray,它允许你使用列表位置作为键

答案 2 :(得分:0)

适合我的工作

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

答案 3 :(得分:0)

这对我来说是最好的解决方案。 Checkbox auto call onCheckedChange when listview scroll?