Как создать объект овеществленного типа в Котлине - PullRequest
0 голосов
/ 24 мая 2018

Я пытался создать функцию расширения для создания объекта держателя вида для адаптера вида переработчика

inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.createViewHolder(@LayoutRes res: Int): T {
    val inflater = LayoutInflater.from(context)
    val itemView = inflater.inflate(res, this, false)
    // return ViewHolder Object
}

Как мне создать объект типа T, который расширяет RecyclerView.ViewHolder, чтобы я мог вернутьиз функции.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Чистое альтернативное решение - явно передать конструктор.Это даже не будет более многословно, потому что параметр типа может быть выведен и больше не нуждается в указании.Используйте вот так:

val viewHolder = my_view_group.create(::MyViewHolder, R.layout.my_layout)

Реализуйте так:

inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.create(createHolder: (View) -> T, @LayoutRes res: Int): T {
    val inflater = LayoutInflater.from(context)
    val itemView = inflater.inflate(res, this, false)
    return createHolder(itemView)
}
0 голосов
/ 24 мая 2018

Это решение довольно уродливо, но я предполагаю, что "теоретически" может работать:

inline fun <reified T: RecyclerView.ViewHolder> ViewGroup.create(@LayoutRes res: Int): T {
        val inflater = LayoutInflater.from(context)
        val itemView = inflater.inflate(res, this, false)
        return T::class.java.getConstructor(View::class.java).newInstance(itemView)
    }

Что делает последняя строка: 1. Получите конструктор T, который соответствует T(view: View) 2. вызовите newInstance этого конструктора, передав ему представление, которое вы надули

Решение адаптировано из https://discuss.kotlinlang.org/t/generic-object-creation/1663/5

Просто вызовите его с помощью:

val viewHolder = my_view_group.create<MyViewHolder>(R.layout.my_layout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...