findViewById возвращает null при привязке ViewHolder (внутри вложенного RecyclerView) - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь использовать вложенный 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...