如何确保arrayadapter不接受重复值

时间:2014-01-28 14:00:18

标签: java android arrays android-arrayadapter

我有一个带有一些pre_populated数据的自定义arrayadapter,并且要从用户输入添加更多数据。问题是仍然将重复值添加到arrayadapter ..我的代码是:

String s;//holds data from user input

for(int i=0 ; i<my_adapter.getCount() ; i++){
 MyCollection itemObject=my_adapter.getItem(i);
 //MyCollection is an object from the collection class
 String c=itemObject.toString();

     if(c.matches(s)){
     //do not add s to array adapter

}else{
   //add s to arrayadapter
    my_arrayvalues.add(new MyCollection(s));
    my_adapter.notifyDataSetChanged();
}

运行上面的代码,即使值不匹配,也不会对适配器进行任何更改。如果我只运行项目而不包括上述代码     添加了重复的值。我可以纠正这个吗?

按照建议完成的答案后,但仍然添加了重复项: 更新后的代码

             hs = new HashSet();
             my_arrayvalues.add(new MyCollections(s));
             hs.addAll(my_arrayvalues);
             my_arrayvalues.clear();
             my_arrayvalues.addAll(hs);
             my_adapter.notifyDataSetChanged();

3 个答案:

答案 0 :(得分:4)

如果你不想允许重复收集你的对象,那么使用Set对象它将不允许重复的值。

Set suggestion = new HashSet();

或者您可以将列表对象添加到此对象,它不会添加重复值

ArrayList al = new ArrayList();
// add elements to al, including duplicates
HashSet hs = new HashSet();
hs.addAll(al);
al.clear();
al.addAll(hs);

根据您的情况更新:

使用您建议的对象而不是上面的所有对象。

答案 1 :(得分:0)

使用String.equals(s)代替String.matches(s)

Equals将比较字符串对象的相等性。

String s;//holds data from user input

for(int i=0 ; i<my_adapter.getCount() ; i++){
 MyCollection itemObject=my_adapter.getItem(i);
 //MyCollection is an object from the collection class
 String c=itemObject.toString();

     if(c.equals(s)){
     //do not add s to array adapter

}else{
   //add s to arrayadapter
    my_arrayvalues.add(new MyCollection(s));
    my_adapter.notifyDataSetChanged();
}

<强> !!! EDIT !!!

虽然以上内容应该可以解决您的问题,但我同意其他解决方案,您应该使用HashSet而不是手动检查所有元素。使用HashSet或同等效果可以提高性能。请查看this回答以获得更好的解释。

答案 2 :(得分:0)

您可以使用不允许重复的Collection。由于您已经实现了自定义适配器,因此可以避免将ArrayAdapter的超级构造函数传递给数据集,并覆盖所需的方法。

例如,您可以使用

LinkedHashSet

并且getCount方法应该返回LinkedHashSet的this。此外,您的课程可以extend BaseAdapter代替ArrayAdapter