2010-09-13 67 views
1

我正在建立一个列表和列表包含每个联系人 复选框来选择哪一个修改例如,问题是 当列表变得比手机屏幕长,滚动是 有效;当我选择一个复选框时,第二个会自动在列表底部选择 。自动选择列表视图中的复选框 - android

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

下面

是代码我使用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; 
    } 
} 

回答

5

的问题是,列表重用视图(因此convertView论点getView)。 在你的代码中,如果你得到一个非空的convertView,你必须将它的复选框选中状态更改为与新内容相关的内容。

假设view1先与id1关联,然后检查它。 然后,您滚动和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]); 

但同样,使用数组是也许不是最有效的实施,特别是如果你在你的列表中元素的数量巨大。

+0

非常感谢你Julien,它的工作,我只是改变了一件事,我改变了布尔值[] itemChecked;到布尔值itemChecked [] = new boolean [100];因为它给了我空指针异常... – Waqar 2010-09-13 20:51:10

0

Yyou还可以使用SparseBooleanArray它允许您使用列表中的位置的关键

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; 
    } 
相关问题