绑定ViewHolder时(在嵌套的RecyclerView内部),findViewById返回null

时间:2020-06-17 23:40:21

标签: android kotlin android-recyclerview

我正在尝试使用嵌套的RecyclerView,以便可以获取在运行时通过API确定的自定义视图列表。

但是,我遇到的问题是,在扩大嵌套的RecyclerView的布局并尝试将其绑定以显示我的数据后,我从findViewById返回了一个NullPointerException,返回了null。这是我正在使用的东西:

外部RecyclerView适配器(onBindViewHolder)

val objectivesRecyclerView: RecyclerView = this.itemView.findViewById(R.id.objectivesHolder)

val layoutManager = LinearLayoutManager(ctx, RecyclerView.VERTICAL, false)
objectivesRecyclerView.apply {
    this.layoutManager = layoutManager
    val adapter = ObjectivesAdapter()
    this.adapter = adapter
    adapter.setObjectivesList(pursuit.objectives)
}

内部RecyclerView的适配器/支架

class ObjectivesAdapter: RecyclerView.Adapter<ObjectivesAdapter.ObjectivesHolder>() {

    private var objectives = arrayListOf<DataClass>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ObjectivesHolder {
        //val inflatedView = parent.inflate(R.layout.objectives_item, false)
        val inflatedView = LayoutInflater.from(parent.context).inflate(R.layout.objectives_item, parent, false)
        return ObjectivesHolder(inflatedView)
    }

    override fun getItemCount() = objectives.size

    override fun onBindViewHolder(holder: ObjectivesHolder, position: Int) {
        holder.bindObjective(objectives[position])
    }

    class ObjectivesHolder(var baseView: View): RecyclerView.ViewHolder(baseView), View.OnClickListener {
        private var objectiveTitleText: TextView = this.itemView.findViewById(R.id.objective_text)
        private val objectiveProgressBar: ProgressBar = this.itemView.findViewById(R.id.objective_progress)
        private val objectiveCheckBox: CheckBox = this.itemView.findViewById(R.id.completion_checkbox)

        // NullPointerException occurs here, and also happens if I move the calls to bindObjective as well
        // Have also swapped out itemView with baseView instead, with the same results

        override fun onClick(v: View?) {}

        fun bindObjective(objective: DataClass) {
            objectiveTitleText.text = objective.objectiveDefinition.progressDescription
            objectiveProgressBar.progress = objective.progress / objective.objectiveDefinition.completionValue
            objectiveCheckBox.isChecked = objective.progress >= objective.objectiveDefinition.completionValue
        }

    }

}


而且,堆栈跟踪(指向内部recyclerview类的初始化)

 java.lang.IllegalStateException: this.itemView.findViewById(R.id.objective_text) must not be null
        at xyz.omnicron.apps.android.dot.ui.objectives.ObjectivesAdapter$ObjectivesHolder.<init>(ObjectivesAdapter.kt:34)
        at xyz.omnicron.apps.android.dot.ui.objectives.ObjectivesAdapter.onCreateViewHolder(ObjectivesAdapter.kt:20)
        at xyz.omnicron.apps.android.dot.ui.objectives.ObjectivesAdapter.onCreateViewHolder(ObjectivesAdapter.kt:13)

我确定问题可能与内部recyclerview的初始化/绑定方式有关,但是也许新鲜的一双眼睛可以帮助我确定问题所在。

非常感谢您的帮助!

编辑:

ObjectivesAdapater =>“内部” RecyclerView的适配器

PursuitsAdapter =>“外部” RecyclerView的适配器

PursuitsFragment =>在初始化外部RecyclerView的地方,在startUpdateLoop函数中设置了数据。

0 个答案:

没有答案