我有一个带有一些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();
答案 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