Мне нужно знать, какие элементы в настоящее время отображаются в моем RecyclerView. В OnScrollListener.onScroll(...)
ListViews нет эквивалента этому методу. Я пытался работать View.getGlobalVisibleRect(...)
, но этот хак слишком уродлив и не всегда работает.
У кого-нибудь есть идеи?
android
android-recyclerview
rekire
источник
источник
getItemCount
может вернуть 1 иfindFirstVisibleItemPosition
-1 по одному и тому же вызову.Наконец, я нашел решение узнать, является ли текущий элемент видимым, из события onBindViewHolder в адаптере.
Ключевым является метод isViewPartiallyVisible из LayoutManager.
В вашем адаптере вы можете получить LayoutManager из RecyclerView, который вы получаете в качестве параметра из события onAttachedToRecyclerView .
источник
для тех, у кого есть логика, которая будет реализована внутри адаптера RecyclerView, вы все равно можете использовать подход @ernesto в сочетании с on scrollListener, чтобы получить доступ к
what you want
RecyclerView. Внутри адаптера у вас будет что-то вроде этого:источник
Вы можете использовать,
recyclerView.getChildAt()
чтобы получить каждого видимого потомка, и установка некоторого тегаconvertview.setTag(index)
для этого представления в коде адаптера поможет вам связать его с данными адаптера.источник
recyclerView.getChildAt()
, вот как это обычноRecyclerView
работает.RecyclerView
будет пытаться удерживать только несколько дочерних представлений, которые в настоящее время видимы (т. е. в пределах экрана, а не видимости как GONE, INVISIBLE), и попытаться перезапустить эти представления при прокрутке пользователя.Приложение :
Предлагаемые функции FindLast ... Позиция () ничего не работает должным образом в сценарии с разрушающейся панели инструментов в то время как панель инструментов расширяется.
Кажется, что вид рециркулятора имеет фиксированную высоту, и хотя панель инструментов развернута, рециркулятор перемещается вниз, частично за пределы экрана. Как следствие, результаты предложенных функций слишком высоки. Пример: последний видимый элемент называется # 9, но на самом деле элемент # 7 является последним, который отображается на экране.
Это поведение также является причиной, по которой моему представлению часто не удавалось прокрутить до правильной позиции, то есть scrollToPosition () не работал правильно (я окончательно свернул панель инструментов программно).
источник
Следующие
Linear / Grid LayoutManager
методы могут быть использованы для проверки, какие элементыvisible
и если вы хотите отслеживать
is item visible on screen
какой-то порог, вы можете обратиться к следующему блогу.https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05
источник
Для
StaggeredGridLayoutManager
этого:И чтобы увидеть видимые элементы:
Не забудьте проверить, если он пуст.
источник
viewsIds
это массив, и он может быть пустым.