【问题标题】:Automatic selection of checkboxes inside listview - android自动选择列表视图中的复选框 - android
【发布时间】:2011-04-11 20:21:08
【问题描述】:

我正在建立一个列表,该列表包含每个联系人 例如,选择要修改哪一个的复选框,问题是 当列表变得比手机屏幕长并且滚动时 积极的;当我选择一个复选框时,第二个会自动 在列表底部选择。

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

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

【问题讨论】:

    标签: android listview checkbox scroll


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      适合我

      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】:

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

        【讨论】:

          【解决方案4】:

          问题在于列表重用了您的视图(因此 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]);
          

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

          【讨论】:

          • 非常感谢 Julien,它成功了,我只是改变了一件事,我改变了 boolean[] itemChecked; to boolean itemChecked[] = new boolean[100];因为它给了我空指针异常...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多