Контекстная проблема при использовании Anko DSL в настраиваемом адаптере для ListView

Я пытаюсь написать универсальный адаптер для ListView который позволяет использовать Anko DSL в качестве содержимого элементов. Код указан ниже. Как вы можете видеть, есть уродливый патч with(viewGroup!!.context) чтобы заставить код работать. Это не похоже на другой пример Анко, который вы видите. Если я удалю оператор with , мое приложение выйдет из строя

 FATAL EXCEPTION: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams 

Есть ли способ избежать утверждения with ?

 import java.util.* import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter class AnkoAdapter(itemFactory: () -> AbstractList<Any>, viewFactory: (index: Int, items: AbstractList<Any>, view: View?, viewGroup: ViewGroup?) -> View): BaseAdapter() { val viewFactory = viewFactory val items: AbstractList<Any> by lazy { itemFactory() } override fun getView(index: Int, view: View?, viewGroup: ViewGroup?): View { return viewFactory(index, items, view, viewGroup) } override fun getCount(): Int { return items.size } override fun getItem(index: Int): Any { return items.get(index) } override fun getItemId(index: Int): Long { return items.get(index).hashCode().toLong() + (index.toLong() * Int.MAX_VALUE) } } // ------------- // In main acitivty. ... val items = listOf<String>("Mary", "Lisa", "Cheryl", "Linda") val buttonCaption = "..." listView.adapter = AnkoAdapter({items as AbstractList<Any>}) { index: Int, items: AbstractList<Any>, view: View?, viewGroup: ViewGroup? -> with(viewGroup!!.context) { linearLayout { textView(items[index].toString()) button(buttonCaption) } } } 

Согласно этому видео , здесь представлена ​​модифицированная версия:

 class AnkoAdapter<T>(itemFactory: () -> List<T>, viewFactory: Context.(index: Int, items: List<T>, view: View?) -> View): BaseAdapter() { val viewFactory = viewFactory val items: List<T> by lazy { itemFactory() } override fun getView(index: Int, view: View?, viewGroup: ViewGroup?): View { return viewGroup!!.context.viewFactory(index, items, view) } override fun getCount(): Int { return items.size } override fun getItem(index: Int): T { return items.get(index) } override fun getItemId(index: Int): Long { return (items.get(index) as Any).hashCode().toLong() + (index.toLong() * Int.MAX_VALUE) } } val items = listOf<String>("Mary", "Lisa", "Cheryl", "Linda") val buttonCaption = "..." lockView.adapter = AnkoAdapter<String>({ items }) { index, items, view -> linearLayout { textView(items[index]) button(buttonCaption) } }