安卓列表项中的checkBox-在检查所有问题后取消选中



在全部选中复选框后,我在取消选中复选框时遇到了一些问题
这里是我的代码的简要概述
我用一个名为"MyAdapter"的自定义适配器填充了一个列表项,在这个适配器中我使用:
1)一个用于保存复选框为checket而非witch的布尔数组
2)"用户"的ArrayList,其中User是一个包含许多信息的类,如电话号码和联系人的姓名
3)我只添加选中用户的ArrayList。

问题是:如果我手动选中所有复选框,然后取消选中某些复选框,那么一切都可以。Vut如果我使用checkAll()方法,我很快就会向您展示,然后手动取消选中一些,它只能以图形方式工作(复选框未选中),但用户未选中不会从对应数组列表中删除。

这是我的代码,任何后都将不胜感激:

public class MyAdapter extends ArrayAdapter<User> {
private boolean[] checkList;
private ArrayList<User> checkedUsersList;
private LinkedList<User> originalList;
private int listSize;
private Context mContext;
public MyAdapter(Context context,int textViewResourceId,
        List<User> objects) {
    super(context,textViewResourceId, objects);
    mContext = context;
    checkedUsersList = new ArrayList<User>();
    originalList = (LinkedList<User>) objects;
    checkList = new boolean[objects.size()];
    listSize = objects.size();
    for(int i=0;i<objects.size();i++)
    {
        checkList[i] = false;
    }
    // TODO Auto-generated constructor stub
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    return getViewOptimize(position, convertView, parent);
}
 public View getViewOptimize(int position, View convertView, ViewGroup parent) {
     final int pos = position;
        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext()
                      .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.rowcustom, null);
            viewHolder = new ViewHolder();
            viewHolder.name = (TextView)convertView.findViewById(R.id.textViewName);
            viewHolder.number = (TextView)convertView.findViewById(R.id.textViewNumber);
            viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.checkBoxUserLine);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        final User utente = getItem(position);
        viewHolder.name.setText(utente.getContactName());
        viewHolder.number.setText(utente.getContactNumber());
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    Toast toast = Toast.makeText(mContext, "Check true notified", 1500);
                    toast.show();
                    if(!checkedUsersList.contains(utente))
                        checkedUsersList.add(utente);
                }
                else 
                {
                    Toast toast = Toast.makeText(mContext, "Check false notified", 1500);
                    toast.show();
                    checkedUsersList.remove(utente);
                }
                checkList[pos] = isChecked;
            }
        });
        viewHolder.checkBox.setChecked(checkList[pos]);
        return convertView;
    }

 public ArrayList<User> getUsersChecked()
 {
     return checkedUsersList;
 }
 public void checkAll()
 {
     for(int i = 0; i<listSize;i++)
     {
         checkList[i] = true;
     }
     checkedUsersList.clear();
     for(User us : originalList)
     {
         checkedUsersList.add(new User(us.getContactName(), us.getContactNumber()));
     }
     notifyDataSetChanged();
 }

    private class ViewHolder {
        public TextView name;
        public TextView number;
        public CheckBox checkBox;
    }

}
for(User us : originalList)
 {
     checkedUsersList.add(new User(us.getContactName(), us.getContactNumber()));
 }

us添加到列表中,而不是添加新的user

在checkAll中将所有用户添加到列表时,您正在创建新用户:

     for(User us : originalList)
     {
         checkedUsersList.add(new User(us.getContactName(), us.getContactNumber()));
     }

替换为

     for(User us : originalList)
     {
         checkedUsersList.add(us);
     }

这就是解决方案。问题是,您正在将原始对象与checkedUsersList中对象的副本进行比较。contains(utente)

通过创建布尔值数组来维护列表复选框的状态。

最新更新