Java 为什么ArrayAdapter接受ArrayList<;字符串>;但未设置<;字符串>;作为参数?

Java 为什么ArrayAdapter接受ArrayList<;字符串>;但未设置<;字符串>;作为参数?,java,android,android-arrayadapter,Java,Android,Android Arrayadapter,我用OnItemClickListener实现了一个ListView,ArrayAdapter接受ArrayList作为参数,但不接受集 这项工作: ArrayList<String> myEntries = new ArrayList<>(); ArrayAdapter<String> myArrayAdapter; ListView listView = (ListView) findViewById(R.id.myListView); myArrayA

我用OnItemClickListener实现了一个ListView,ArrayAdapter接受
ArrayList
作为参数,但不接受

这项工作:

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);
ArrayList myEntries=new ArrayList();
ArrayAdapter myArrayAdapter;
ListView ListView=(ListView)findViewById(R.id.myListView);
myArrayAdapter=新的ArrayAdapter(this,R.layout.listviewitem,myEntries);
setAdapter(myArrayAdapter);
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);
Hashtable myEntries=new Hashtable();
ArrayAdapter myArrayAdapter;
ListView ListView=(ListView)findViewById(R.id.myListView);
myArrayAdapter=newArrayAdapter(this,R.layout.listviewitem,myEntries.keySet());
setAdapter(myArrayAdapter);
setOnItemClickListener(this);
我收到以下编译器错误:

Cannot resolve constructor 'ArrayAdapter(com.example.MainActivity, int, java.util.Set<java.lang.String>)'
无法解析构造函数'ArrayAdapter(com.example.MainActivity,int,java.util.Set)'
这两个myentry都存储字符串,为什么ArrayAdapter不接受

为什么ArrayAdapter不接受该设置

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

我猜那是因为
集合
不能被索引;i、 e.它不是“阵列式”。
ArrayAdapter
设计用于调整数组和行为类似于数组的事物

以下是两个备选方案:

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

  • 您可以切换到CursorAdapter,并实现(或查找)一个游标类,该类在集合上提供只读或读写游标。问题:这只适用于为元素提供稳定排序的集合实现<代码>哈希集没有

从中可以看到,它可以包含一个列表。ArrayList是一种列表类型。集合不是列表的类型,因此编译器拒绝它


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

查看可用的重载。不能这样做,因为ArrayAdapter的构造函数没有接受类型集