У меня есть список из 13 элементов (хотя элементы могут быть добавлены или удалены), позиции 0-12. Когда первый фрагмент, содержащий RecyclerView, сначала отображается, только позиции с 0 по 7 видны пользователю (позиция 7 отображается только наполовину). В моем адаптере я Log
каждый раз, когда держатель вида привязан/привязан (idk, если здесь применяется грамматика) и записывайте его положение.
Адаптер
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
Log.d(TAG, "onBindViewHolder() position: " + position);
...
}
Из моего Log
я вижу, что позиции 0-7 связаны:
У меня есть метод selectAll()
, который получает каждую позицию ViewHolder
по позиции адаптера. Если возвращаемый holder
НЕ null
, я использую возвращенный holder
, чтобы обновить представление, чтобы отобразить его. Если возвращенный держатель IS null
, я вызываю selectOnBind()
метод, который помещает представление в этом обновлении позиции, чтобы отображать его, когда он привязан, а не в реальном времени, так как в настоящее время он не отображается:
public void selectAll() {
for (int i = 0; i < numberOfItemsInList; i++) {
MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder)
mRecyclerView.findViewHolderForAdapterPosition(i);
Log.d(TAG, "holder at position " + i + " is " + holder);
if (holder != null) {
select(holder);
} else {
selectOnBind(i);
}
}
}
В этом методе я Log
holder
вместе с его положением:
Итак, до этого момента все кажется нормальным. У нас есть позиции 0-7, и в соответствии с Log
они связаны с позициями. Когда я ударил selectAll()
, не изменяя видимые виды (прокрутка), я вижу, что позиции 0-7 определены, а 8-12 - null
. Пока все хорошо.
Здесь, где это становится интересным. Если после вызова selectAll()
я прокручиваю дальше вниз, позиции 8 и 9 списка не показывают, что они выбраны.
При проверке Log
я вижу, что это потому, что они никогда не связаны, хотя они были сообщены как null
:
Еще более запутанным является то, что это не происходит каждый раз. Если я впервые запустил приложение и проверил его, он может работать. Но, похоже, это происходит безуспешно после этого. Я предполагаю, что это имеет какое-то отношение к просмотрам, которые перерабатываются, но даже не нужно ли их связывать?
РЕДАКТИРОВАТЬ (6-29-16)
После обновления AndroidStudio я не могу воспроизвести ошибку. Он работает так, как я ожидал, привязывая нулевые представления. Если эта проблема возникнет, я вернусь к этому сообщению.