Я пытаюсь использовать вложенный RecyclerView, чтобы иметь список настраиваемых представлений, который определяется во время выполнения через API.
Проблема, с которой я столкнулся, заключается в том, что после надувания вложенный макет RecyclerView и пытаясь привязать его для отображения моих данных, я получаю исключение NullPointerException от findViewById, возвращающего значение 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. инициализирован / привязан, но, возможно, пара бесплатных sh глаз может помочь мне изолировать проблему.
Любая помощь очень ценится!
Изменить:
ObjectivesAdapater => «Внутренний» адаптер RecyclerView
PursuitsAdapter => «Внешний» адаптер RecyclerView
PursuitsFragment => Где инициализируется внешний RecyclerView, данные устанавливаются в функции startUpdateL oop.