Почему ArrayAdapter принимает ArrayList<String>, но не устанавливает<String> в качестве параметра?

Я реализовал ListView с OnItemClickListener, 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 ответа

Решение

почему ArrayAdapter не принимает набор?

Поскольку API не имеет перегрузки конструктора, которая совместима с Set,

Я думаю, что это потому, что Set не может быть проиндексирован; то есть это не "массив как". ArrayAdapter предназначен для адаптации массивов и вещей, которые ведут себя как массивы.

Вот несколько альтернатив:

  • Вы можете скопировать установленное содержимое в список или массив и продолжить использовать ArrayAdapter. Проблема: изменения, сделанные через адаптер, не обновят исходный набор.

  • Вы можете переключиться на CursorAdapter и реализовать (или найти) класс Cursor, который предоставляет курсор только для чтения или чтения-записи над вашим набором. Проблема: это будет работать только для реализации набора, которая обеспечивает стабильный порядок для его элементов. HashSet не делает.

Как вы можете видеть из javadoc для ArrayAdapter, он может принимать список. ArrayList является типом List. Набор не является типом List, поэтому компилятор отклоняет его.

ArrayAdapter требует List, потому что Set не имеет естественного порядка, поэтому нет смысла показывать Set в упорядоченном списке, если вы не знаете, каков порядок. Вы все еще можете преобразовать Set в тип List, если вас не заботит порядок, и вы можете сортировать полученный список по мере необходимости.

Другие вопросы по тегам