为什么 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 进行排序。
我已经使用 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 进行排序。