【问题标题】:I have to remove element from arraylist on unchecking the checkbox在取消选中复选框时,我必须从 arraylist 中删除元素
【发布时间】:2015-12-14 16:34:34
【问题描述】:

元素在选中复选框时被添加到数组列表中,但在取消选中它时不会被删除。 在取消选中复选框时,我必须从 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,但在取消选中复选框时不会删除元素。

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

【问题讨论】:

  • 如何从列表中删除不存在的项目?
  • 我有一个带有复选框的自定义列表。第一个用户将通过选中复选框从列表中选择任何元素,该元素将被添加到 ArrayList 中。但是在通过取消选中复选框取消选择元素时,该元素应该从 ArrayList 中删除。
  • NameModel 实现了等号和哈希码?
  • No NameModel 没有实现 equals 和 hashcode。

标签: java android checkbox arraylist baseadapter


【解决方案1】:
public void onClick(View view) {
    model = new NameModel(NameList.get(position).getName());
    (...)
    CustomAdapter.nameArray.add(model);
    (...)
    CustomAdapter.nameArray.remove(model);
}

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

你有两种选择:

  • NameModel 上实现equals()hashcode(),因此Collection 知道您新创建的对象与已经存在的对象“相同”;

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

【讨论】:

  • 是的,Marcelo,你是对的,我只是注意到我每次都在 onClick 事件中创建一个新的模型对象。谢谢。但是你能详细说明一下我需要在 equals() 和 hashcode() 中实现什么吗?
  • @user3098795 这取决于您的业务逻辑,但从您的代码看来,您希望比较 name 属性。查看this answer 以获得如何实现这些方法的一个很好的示例。
  • 谢谢马塞洛。我想这会奏效,我会尝试这种方式。
【解决方案2】:

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

NameModel 中适当地覆盖equals(),您的代码将正常工作。

【讨论】:

    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 2015-05-19
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多