Problema de context al usar Anko DSL dentro del adaptador personalizado para ListView

Estoy intentando escribir un adaptador de propósito general para ListView que permite usar Anko DSL como el contenido de los artículos. El código se enumera a continuación. Como puede ver, hay un parche feo with(viewGroup!!.context) para hacer que el código funcione. No le gusta el otro ejemplo de Anko que hayas visto. Si elimino la statement with , mi aplicación se bloqueará

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

¿Hay alguna manera de evitar la statement 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) } } } 

De acuerdo con este video , aquí está la versión modificada:

 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) } } 
  • ¿Es posible reutilizar un layout en Kotlin Anko?
  • Error: no se puede cambiar el título de SupportActionBar
  • Cómo establecer el ancho del borde FloatingActionButton con Anko
  • ¿Cómo puedo configurar FlexBox.alignItems para flex_end programáticamente?
  • android.view.InflateException: file XML binary línea # 32: file XML binary línea # 32: class de inflado de error
  • Reproductor de video flotante de estilo Youtube
  • Obtener el porcentaje de orientación en píxeles mediante progtwigción
  • Restricción del layout de la falla intermitente del layout
  • Diseño inflado por progtwigción con las extensiones de Kotlin para Android