Я не уверен, что вы можете положиться на тот факт, что в держателях, которые вы создаете в onCreateViewHolder
, будут храниться одинаковые виды для тех же позиций в onBindViewHolder
, после того как цель представления переработчика состоит в том, чтобы повторно использовать виды,По сути, вы можете получить предыдущих держателей просмотра, которые вышли за пределы экрана, и вам придется их переработать.Очисти штат и поставь новый.Возможно, вам повезет, что они содержат нужные вам представления, но вы не можете.Когда у вас есть 2 или более разных вида, обычно подход состоит в том, чтобы использовать типы представлений - см. Этот ответ .
. В любом случае, давайте предположим, что вы можете быть уверены, что держатель будет иметьвид вы ожидаете.Допустим, ваш взгляд переработчика имеет 1 элемент.Это выражение this.counter % 2 == 0
оценивается как true
, и вы создаете держатель для «серого» вида.Затем вы увеличиваете значение counter
- this.counter ++;
.Вызывается onBindViewHolder
и оценивается то же условие, но теперь выясняется, что counter
странно, и вы пытаетесь получить доступ к подпредставлениям своего "синего" представления, которые на самом деле никогда не были раздутыми.Это вызывает исключение нулевого указателя в holder.textViewBlue.setText
.
Я предлагаю проверить типы представлений и реализовать их для вашего варианта использования.