我必须在取消选中复选框

时间:2015-09-17 17:34:36

标签: java android checkbox arraylist baseadapter

元素在检查复选框时添加到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,但在取消选中复选框时不删除该元素。

对上述问题的任何帮助将不胜感激。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

您有两种选择:

  • equals()上实施hashcode()NameModel,以便Collection知道您新创建的对象与已存在的对象“相同”; < / p>

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

答案 1 :(得分:0)

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

适当地覆盖equals()中的NameModel,您的代码就可以运行了。