Почему на Android нельзя использовать списки без адаптеров?
Потому что Single Responsibility Principle, aka
Принцип Единственной Обязанности. Каждый класс должен иметь одну-единственную ответственность. В приведенном вами примере
ListView
отвечает за то, чтобы компоновать предоставленные ему виджеты в виде списка, а
Adapter
отвечает за то, чтобы создавать поставляемые виджеты.
Разделение ответственности приводит к тому, что классы становятся более простыми и менее подверженными ошибкам при внесении в них изменений. Также выделение адаптера в отдельный класс позволяет относительно быстро подменять его реализации - сегодня для того, чтобы поставлять вашему
ListView
новые виджеты вам нужен
ArrayAdapter
, так как у вас два десятка элементов, которые вы получаете из сети, и их можно хранить в памяти, а (утрируя) завтра элементов становится две тысячи и в памяти их держать уже не комильфо, соответственно вы решаете прикрутить кеширование элементов в БД, и теперь вам уже нужен
CursorAdapter
.
Исходя из того же самого принципа, например, в Java ответственность "хранить элементы" возложена на классы, имплементирующие интерфейс
Collection
, а ответственность "перебирать элементы" - на классы, имплементирующие интерфейс
Iterator
, хотя можно было бы свалить всё в одну кучу.