我必须在取消选中复选框时从 arraylist 中删除元素

I have to remove element from arraylist on unchecking the checkbox

元素在选中复选框时添加到 arraylist 中,但在取消选中时不会被删除。 我必须在取消选中复选框时从 arraylist 中删除元素。 我写了下面的代码,请告诉我哪里错了。

public class CustomAdapter extends BaseAdapter{
NameModel model;
public static ArrayList<NameModel> nameArray;

public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    convertView = mInflater.inflate(R.layout.item_list, null);

    name = (TextView)convertView.findViewById(R.id.name);
    cb = (CheckBox)convertView.findViewById(R.id.checkBox1);
    cb.setTag(position);
    nameArray = new ArrayList<NameModel>();

    cb.setOnClickListener(new View.OnClickListener() {              
        @Override
        public void onClick(View view) {
            int position = (Integer)view.getTag();                  
            CheckBox checkbox = (CheckBox)view;                 

            model = new NameModel(NameList.get(position).getName());
            model.setCheckedStatus(checkbox.isChecked());
            model.setName(NameList.get(position).getName());
            if(checkbox.isChecked()){
                CustomAdapter.nameArray.add(model);
                Toast.makeText(context, "item checked ", Toast.LENGTH_SHORT).show();
            }else{
                CustomAdapter.nameArray.remove(model);
                Toast.makeText(context, "item unchecked ", Toast.LENGTH_SHORT).show();
            }
        }
    });
}
return convertView;

}

我已将 ArrayList 声明为静态的,因为在 getView 方法中无法访问它。

执行时,它会按预期打印两个 toast,但不会在取消选中复选框时删除元素。

如能就上述问题提供帮助,我们将不胜感激。 提前致谢。

public void onClick(View view) {
    model = new NameModel(NameList.get(position).getName());
    (...)
    CustomAdapter.nameArray.add(model);
    (...)
    CustomAdapter.nameArray.remove(model);
}

请注意,您总是在 onClick 事件中创建 Model 对象。除非您的 NameModel class 正确实现了 equals()hashcode(),否则该对象不会从列表中删除 - 仅仅是因为它不存在!您拥有的是一个列表,其中包含一个具有相同名称但内存地址不同的对象。

您有两个选择:

  • NameModel上实现equals()hashcode(),所以Collection知道你新创建的对象是"the same"已经有一个了;

  • 遍历列表搜索具有相同名称的元素并将其删除。

当你从ArrayList中删除时,它通过equals()方法确定要删除的对象。默认情况下,这将使用对象标识。但是,您移除的对象是全新的。因此,它不会与您的集合中的任何元素匹配,并且不会删除任何内容。

适当地覆盖 NameModel 中的 equals(),您的代码将起作用。