Контекстная проблема при использовании 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) } } 
Intereting Posts
Gson не может десериализовать общий тип ArrayList, используя TypeToken Войти в firebase в студии kotlin android Использование класса Kotlin в Java: не удается найти символ Применение плагина «kotlin-android» в мгновенном приложении приводит к тому, что «null не может быть применено к ненулевому типу com.android.build.gradleBasePlugin» Как создать обработчик Generic Response для ошибки и проверки ответа с помощью модифицированных, rxjava и кинжалов Не удалось найти kotlin-reflect.jar (org.jetbrains.kotlin: kotlin-reflection: 1.1.3-2) в android studio 3.0 ClassNotFoundException в Android-проекте только на моем ПК содержание в параметре основного развлечения в котлине AppCompatActivity, ViewModel и привязка данных Как сделать метод param изменчивым в Kotlin? Android Studio не применяет мои изменения в дизайне Каким был бы базовый сценарий Gradle Kotlin для проекта Jot Kotlin? Как добавить содержимое одной коллекции в новую коллекцию Kotlin: Intrinsics.areEqual бесконечный цикл (переполнение стека) Kotlin – Это отличный способ бросить NotImplementedError для всех методов класса?