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