1

我想使用 RxJava2 在 RecyclerView 项目上设置一个侦听器。这些项目是复选框。我想分别听每个项目。所以我得到一个错误内部类ViewHolder的构造函数只能用包含类的接收器调用

返回 TraceAdapter.ViewHolder(视图)

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
        }
    }
}
}
4

1 回答 1

7

我认为您只需要更改此行:

return TraceAdapter.ViewHolder(view)

对此:

return ViewHolder(view)

由于您已将其显式标记为内部类,因此它需要外部类的实例,默认情况下您会获得该实例,因为您是从外部类中构建它的。但是,仅当您不使用外部类类型作为前缀时,如上所示。

在 Kotlin 和 Java 中,内部类和嵌套类之间的区别有点不同(Java 使用术语static来表示没有外部类实例的嵌套类)。这里有更详细的解释。

于 2018-11-28T15:08:45.160 回答