我正在尝试使用嵌套的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函数中设置了数据。