Kotlin Generics для адаптера RecyclerView - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь написать универсальный адаптер переработчика.Я нашел несколько примеров.Однако до сих пор не смог понять, как добиться универсального адаптера.Код, который я написал:

open abstract class BaseAdapter<T : RecyclerView.ViewHolder>(private val onClickListener: View.OnClickListener, @LayoutRes private val layoutResource:Int) :
        RecyclerView.Adapter<T>() {
        var items: MutableList<Item> = mutableListOf()

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T  {
            val layout = LayoutInflater.from(parent.context).inflate(layoutResource, parent, false)
            layout.setOnClickListener(onClickListener)
            return T(layout)
        }

        override fun getItemCount(): Int {
            return items.size
        }
    }

Я получаю сообщение об ошибке в строке return T(layout).Ошибка Expression 'T' of type 'Int' cannot be invoked as a function. The function 'invoke()' is not found.

1 Ответ

2 голосов
/ 11 июня 2019

Котлин не позволяет создавать объекты типа, который был идентифицирован в параметрах типа (в отличие от C # can).

Так что в вашем случае вы можете оставить абстрактный класс без onCreateViewHolder реализации метода. Или вы можете добавить другой абстрактный метод и вызвать его в onCreateViewHolder.

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): T  {
    val layout = LayoutInflater.from(parent.context).inflate(layoutResource, parent, false)
    layout.setOnClickListener(onClickListener)
    return createHolderInstance(layout)
}

abstract fun createHolderInstance(layout: View): T

Таким образом, в дочерних классах должно быть меньше кода. Например:

class UsersAdapter(...) : BaseAdapter<UserHolder>(...) {
    override fun createHolderInstance(layout: View) = UserHolder(layout)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...