Каждая строка в вашем списке может быть полностью разделена с точки зрения макета из других. Поэтому, если у вас есть 3 строки в вашем списке, вы можете посмотреть, что каждый может выглядеть совершенно иначе. Вам необходимо написать собственный адаптер (например, расширение ArrayAdapter), переопределить getView(), getViewTypeCount() и getItemViewType(). Затем для каждой строки ваш getView() должен выполнить любую логику, которую вы хотите, раздуть любой макет, который вы хотите, и вернуть этот вид в список.