为什么ArrayAdapter接受ArrayList <string>但不接受Set <string>作为参数?

时间:2016-03-09 02:55:36

标签: java android android-arrayadapter

我已经使用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>

2 个答案:

答案 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类型,并且您可以根据需要对结果列表进行排序。