Как победить recycling в RecyclerView или альтернативные решения проблемы?
привет, я джун в одной из огромного количества студий
столкнулся с достаточно сложной на мой взгляд задачей:
есть сетка, которая может менять свою конфигурацию (4 столбика, 2 столбика, 1 столбик и 2 столбика с первым элементом, который растянут на два столбика), поддерживает драгНдроп
элементы сетки - потоки RTSP с камер видеонаблюдение
сложность в том, что есть необходимость менять конфигурации сетки без перезагрузки видео (и по возможности скролить)
решения:
1. FlexboxLayout - отлично подходит для этой задачи, за исключением встроенного красивого драгНдропа
2. RecyclerView + FlexboxLayoutManager - отличное решение, сейчас выбрал его как основное, но есть проблемы:
#1 получается менять только ширину вьюшек, а высота остается прежней (спасает notifyDataSetChanged(), но тогда происходит перезагрузка потока)
#2 при выходе вьюшки за пределы видимости, она быстро детачится и при повторном её появлении видео грузится заново (тут нужно увеличить "threshold". пробовал `RecyclerView#setItemViewCacheSize(int)` и `RecycledViewPool#setMaxRecycledViews(int, int)`, но никакого результата не последовало)
Так же буду рад, если подскажете направления для ресерча или альтернативные решения
P.S. элемент сетки должен сохранять отношение сторон 16:9, но это решается с помощью `PercentFrameLayout` в идеале
P.P.S. при попытке редактировать размер View, которые в данный момент не на экране, ловлю NPE, но это, вроде как, логично
По-моему, в идеале вам надо это решать не "побежданием" ресайклинга, а улучшением архитектуры. Нужен некий репозиторий, где будут кешироваться видео на недолгое время. Когда ресайклер хочет показывать - брать поток из репозитория.
Денис Загаевский: столкнулся с другой забавной проблемой:
переопределил `GridLayoutManager#getDecoratedMeasuredHeight(View)`, чтобы тот устанавливал отношение 16:9 для всех вьюх
результат: меняется граница, а внутренние вьюхи выпадают за пределы и обрезаются