У меня есть список из 13 элементов (хотя элементы могут быть добавлены или удалены), позиции 0-12. Когда первый фрагмент, содержащий RecyclerView, сначала отображается, только позиции с 0 по 7 видны пользователю (позиция 7 отображается только наполовину). В моем адаптере I Log
каждый раз, когда держатель вида привязан/привязан (idk, если здесь применяется грамматика) и записывайте его позицию.onBindViewHolder() никогда не вызывается при просмотре в позиции, хотя RecyclerView.findViewHolderForAdapterPosition() возвращает null в этой позиции
адаптер
@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
:
Еще более запутанным является то, что это не происходит каждый раз. Если я впервые запустил приложение и проверил его, он может работать. Но, похоже, это происходит безуспешно после этого. Я предполагаю, что это имеет какое-то отношение к просмотрам, которые перерабатываются, но даже не нужно ли их связывать?
EDIT (6-29-16)
После обновления AndroidStudio я не могу показаться, чтобы воспроизвести ошибку. Он работает так, как я ожидал, привязывая нулевые представления. Если эта проблема возникнет, я вернусь к этому сообщению.
Неправильная практика выбора вашей строки, как и вы (и она не работает), лучший подход - иметь список (или карту) элемента select, а затем в поле «onBind» в вашем списке или в не. если он существует, измените строку на выбранную, иначе покажите нормальную строку. –
Это то, что у меня есть. Но если вы только обновите их в 'onBind', пользователь не увидит изменения в видимых элементах, пока они не будут привязаны снова (это может быть' onResume' или прокрутка). Я не использовал лишний код, чтобы не усложнять вопрос. Хотя я хотел бы найти еще более чистый способ, чем то, как у меня есть, и вы упомянули. – YoungCoconutCode
вы можете вызвать 'notifyDataSetChanged' или' notifyItemChanged' для вызова 'onBind' вручную –