2015-09-17 71 views
0

元素被添加到arraylist检查复选框,但不取消选中它。 取消选中复选框,我必须从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方法访问。

执行时,按预期方式打印两个吐司,但不取消选中复选框时删除该元素。

对上述问题的任何帮助将不胜感激。 在此先感谢。

+0

如何从列表中删除不存在的项目? –

+0

我有一个复选框的自定义列表。第一个用户将通过选中该复选框从列表中选择任何元素,并将该元素添加到ArrayList中。但是通过取消选中复选框来取消选择该元素时,该元素应该从ArrayList中移除。 – user3098795

+0

NameModel有一个equals和hash代码实现? – StackFlowed

回答

2
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(),否则该对象将不会从列表中删除 - 仅仅因为它不在那里!你所拥有的是一个包含一个具有相同名称但存储地址不同的对象的列表。

你有两种选择:

  • 落实NameModelequals()hashcode(),所以Collection知道你的新创建的对象是“相同”作为一个已经存在;

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

+0

是的Marcelo,你是对的,我只是注意到我每次在onClick事件中创建一个新的模型对象。谢谢。但是,你能详细说明我需要在equals()和hashcode()中实现什么功能吗? – user3098795

+0

@ user3098795这取决于您的业务逻辑,但您的代码似乎想要比较'name'属性。查看[这个答案](http://stackoverflow.com/a/27609/1167210)了解如何实现这些方法的一个很好的例子。 – Marcelo

+0

谢谢马塞洛。我想这会起作用,我会试试这种方式。 – user3098795

0

当从ArrayList除去时,它确定经由equals()方法要除去的对象。默认情况下,这将使用对象标识。但是,删除的对象是全新的。因此,它不会匹配您收藏的任何元素,也不会删除任何元素。

恰当地覆盖equals()NameModel并且您的代码将正常工作。