Конструктор внутреннего класса ViewHolder может быть вызван только с получателем содержащего класса - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу установить прослушиватель для элементов RecyclerView, используя RxJava2.Элементы являются флажками.Я хочу слушать каждый пункт отдельно.Поэтому я получаю сообщение об ошибке. Конструктор внутреннего класса ViewHolder может быть вызван только с получателем содержащего класса в

return TraceAdapter.ViewHolder (view)

class TraceAdapter(private var checkList: List<TraceViewModelRow> = listOf()) :
    RecyclerView.Adapter<TraceAdapter.ViewHolder>() {

private val publishSubject = PublishSubject.create<Event>()
val events: Observable<Event> = publishSubject

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TraceAdapter.ViewHolder {
    val view = LayoutInflater.from(parent.context).inflate(R.layout.item_trace_task, parent, false)
    return TraceAdapter.ViewHolder(view)
}

override fun getItemCount(): Int = checkList.size

override fun onBindViewHolder(holder: TraceAdapter.ViewHolder, position: Int) {

    holder.bindTraceList(checkList[position])

}

override fun onViewRecycled(holder: ViewHolder) {
    super.onViewRecycled(holder)
}

inner class ViewHolder(override val containerView: View) : RecyclerView.ViewHolder(containerView), LayoutContainer {

    fun bindTraceList(trace: TraceViewModelRow) {
        with(trace) {
            checkbox_itemText.clicks()
                    .map { checkList[layoutPosition] }
                    .subscribe { publishSubject }

            checkbox_itemText.text = description
            checkbox_itemText.isChecked = isChecked
        }
    }
}
}

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю, вам просто нужно изменить эту строку:

return TraceAdapter.ViewHolder(view)

на эту:

return ViewHolder(view)

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

Различие между внутренним и вложенным классами немного отличается в Kotlin и Java (Java использует термин static для вложенногоклассы, которые не имеют экземпляра внешнего класса).Это объяснено более подробно здесь .

...