为什么 ArrayAdapter 接受 ArrayList<String> 而不是 Set<String> 作为参数?

Why does ArrayAdapter accept ArrayList<String> but not Set<String> as paramenter?

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

why doesn't ArrayAdapter accept the Set?

因为 API 没有与 Set 兼容的构造函数重载。

我猜那是因为 Set 无法被索引;即它不是 "array like"。 ArrayAdapter 旨在适应数组和行为类似于数组的事物。

这里有几个备选方案:

  • 您可以将设置的内容复制到列表或数组中,继续使用ArrayAdapter。问题:通过适配器所做的更改不会更新原始集。

  • 您可以切换到 CursorAdapter,并实现(或找到)一个 Cursor class,它在您的集合上提供只读或读写游标。问题:这仅适用于为其元素提供稳定排序的集合实现。 HashSet 没有。

javadoc for ArrayAdapter可以看出,它可以带一个List。 ArrayList 是 List 的一种。 Set 不是 List 的类型,因此编译器拒绝它。

ArrayAdapter 需要 List,因为 Set 没有自然顺序,所以如果您不知道顺序是什么,在有序列表中显示 Set 是没有意义的。如果您不关心排序,您仍然可以将 Set 转换为一种类型的 List,并且您可以根据需要对生成的 List 进行排序。