我已经使用OnItemClickListener实现了ListView,ArrayAdapter接受ArrayList<String>
作为参数但不接受Set<String>
。
这有效:
ArrayList<String> myEntries = new ArrayList<>();
ArrayAdapter<String> myArrayAdapter;
ListView listView = (ListView) findViewById(R.id.myListView);
myArrayAdapter = new ArrayAdapter<>(this, R.layout.listviewitem, myEntries);
listView.setAdapter(myArrayAdapter);
listView.setOnItemClickListener(this);
这不起作用:
Hashtable<String, File> myEntries = new Hashtable<>();
ArrayAdapter<String> myArrayAdapter;
ListView listView = (ListView) findViewById(R.id.myListView);
myArrayAdapter = new ArrayAdapter<>(this, R.layout.listviewitem, myEntries.keySet());
listView.setAdapter(myArrayAdapter);
listView.setOnItemClickListener(this);
我收到以下编译错误:
Cannot resolve constructor 'ArrayAdapter(com.example.MainActivity, int, java.util.Set<java.lang.String>)'
两个myEntries存储字符串,为什么ArrayAdapter不接受Set<String>
?
答案 0 :(得分:1)
为什么ArrayAdapter不接受Set?
因为API没有与Set
兼容的构造函数重载。
我的猜测是因为Set
无法编入索引;即它不是&#34;数组像&#34;。 ArrayAdapter
旨在调整阵列和行为类似数组的东西。
以下是两种选择:
您可以将设置内容复制到列表或数组,然后继续使用ArrayAdapter。问题:通过适配器进行的更改不会更新原始设置。
您可以切换到CursorAdapter,并实现(或查找)Cursor类,该类在您的集合上提供只读或读写游标。问题:这只适用于为其元素提供稳定排序的set实现。 HashSet
没有。
答案 1 :(得分:1)
从javadoc for ArrayAdapter可以看出,它可以采用一个列表。 ArrayList是一种List。 Set不是List的类型,因此编译器拒绝它。
ArrayAdapter需要一个List,因为Set没有自然排序,所以如果您不知道订单是什么,在有序列表中显示Set是没有意义的是。如果您不关心排序,您仍然可以将Set转换为List类型,并且您可以根据需要对结果列表进行排序。