Почему на Android нельзя использовать списки без адаптеров?

Приходится извращаться вот так:
// получаем экземпляр элемента ListView
ListView listView = (ListView)findViewById(R.id.listView);

// определяем массив типа String
final String[] catNames = new String[] {
    "Рыжик", "Барсик", "Мурзик"	    
  };

// используем адаптер данных
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,	
        android.R.layout.simple_list_item_1, catNames);

listView.setAdapter(adapter);

И это ListView, про Recycler вообще не говорю, еще больше кода

А хотелось бы:
ListView listView = (ListView)findViewById(R.id.listView);
listView.add("Рыжик");
listView.add("Барсик");
listView.add("Мурзик");


И самое странное то что никто так и не задался этим вопросом и не сделал свой extends ListView с блекджеком и шлюхами.
Вроде везде это есть, Winforms, WPF, Qt а тут нет.
  • Вопрос задан
  • 664 просмотра
Пригласить эксперта
Ответы на вопрос 5
artemgapchenko
@artemgapchenko
Почему на Android нельзя использовать списки без адаптеров?

Потому что Single Responsibility Principle, aka Принцип Единственной Обязанности. Каждый класс должен иметь одну-единственную ответственность. В приведенном вами примере ListView отвечает за то, чтобы компоновать предоставленные ему виджеты в виде списка, а Adapter отвечает за то, чтобы создавать поставляемые виджеты.

Разделение ответственности приводит к тому, что классы становятся более простыми и менее подверженными ошибкам при внесении в них изменений. Также выделение адаптера в отдельный класс позволяет относительно быстро подменять его реализации - сегодня для того, чтобы поставлять вашему ListView новые виджеты вам нужен ArrayAdapter, так как у вас два десятка элементов, которые вы получаете из сети, и их можно хранить в памяти, а (утрируя) завтра элементов становится две тысячи и в памяти их держать уже не комильфо, соответственно вы решаете прикрутить кеширование элементов в БД, и теперь вам уже нужен CursorAdapter.

Исходя из того же самого принципа, например, в Java ответственность "хранить элементы" возложена на классы, имплементирующие интерфейс Collection, а ответственность "перебирать элементы" - на классы, имплементирующие интерфейс Iterator, хотя можно было бы свалить всё в одну кучу.
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
Можно и без адаптера добавлять любые view.
listView.addView(view);
Ответ написан
Комментировать
@Tiberal
Ваш подход не расширяем
Ответ написан
Комментировать
thelongrunsmoke
@thelongrunsmoke
Программист
А вы подумали о гибкости такого подхода? ListView и RecyclerView тем и интересны, что позволяют добавлять в список произвольное View и реализовывать элементы Rx.
Думаю, вопрос связан с попыткой использовать ListView вместо Spinner. Каждому View своё место.
Другие среды имеют свои аналоги ListView, позволяющие позволяющие использовать иерархии в качестве элементов списка.
Ответ написан
Комментировать
@bracadabra
Если добавлять через xml, то элементы будут автоматически добавлены как header. А вообще, для таких случаев есть ScrollView, так как основная задача ListView в переиспользовании элементов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы