Size: a a a

StartAndroid Ru Chat

2021 March 03

А

Артём in StartAndroid Ru Chat
Сергей П.
Или просто верстка из кода на линеарах.
Примерно так, из исходного списка:
Создали вложенный горизонтальный линеар1, добавляем в него дочерние элементы из списка пока суммарная их желаемая ширина в пикселях не превысит ширину родителя; как превысила - добавляем элементы в следующие.


При удалении/добавлении проще все сначала пересчитать чем разницу (ну потом можно будет и норм сделать)
А чем Chips плохи? Никак не пойму.
источник

S

Sergey in StartAndroid Ru Chat
Алекс
Зачем тебе именно в холдере это получать? Какую цель преследуешь, просто даже на ум не прихрдит для чего тебе нужен лист в холдере.
Но как вариант, сделай интерфейс.
Adapter():someInterface
У которого например метод getAdapterList()
Прокинь интерфейс в createviewholder
И там вызывай метод интерфейса, а адаптер его реализует и ьы получишь лист с данными, но не понимаю зачем это нужно)))
По сути это запускатель окна с данными по списку. Он может меняться. И чтобы в момент нажатия открыть окно с актуальными данными))

А разве реализовав его в адаптере как внутренний анонимный класс,  не буду держать ссылку на адаптер, которую отдам холдеру?
источник

А

Артём in StartAndroid Ru Chat
Sergey
По сути это запускатель окна с данными по списку. Он может меняться. И чтобы в момент нажатия открыть окно с актуальными данными))

А разве реализовав его в адаптере как внутренний анонимный класс,  не буду держать ссылку на адаптер, которую отдам холдеру?
Так адаптер знает об изменениях списка. И биндит элементы под нужный position. Если Вам надо достать айтем согласно position, то из onBindViewHolder этот айтем нужно просто прокинуть в viewHolder. И он там будет актуальный.
Либо я не понял проблему.
источник

V

Vladushka in StartAndroid Ru Chat
Артём
Мне кажется, для такой ситуации "базовый фрагмент" оптимален. В чём проблема? Раз при переходе сначала идёт поход на бэк, то, выходит, надо показывать загрузку в этот момент. Вот с ней фрагмент и сделать, а оттуда уже реплейс на какой-то нужный.
Либо реально server driven вёрстка, однако, это гемор. Хотя с Jetpack COmpose можно. 😂
В целом хотелось мнение со стороны ) и я его услышала ))
источник

А

Алекс in StartAndroid Ru Chat
Оу, тогда все делается проще.
В холдере можно получить текущую позицию куда ткнули и по позиции ты можешь получить элемент листа и передать его куда тебе надо чтобы открыть активити или фрагмент
источник

А

Артём in StartAndroid Ru Chat
Vladushka
В целом хотелось мнение со стороны ) и я его услышала ))
А. Извините. Я чёт ворвался немножко в уже кучу сообщений и, видимо, не всё понял. :)
источник

А

Алекс in StartAndroid Ru Chat
Алекс
Оу, тогда все делается проще.
В холдере можно получить текущую позицию куда ткнули и по позиции ты можешь получить элемент листа и передать его куда тебе надо чтобы открыть активити или фрагмент
И небольшое дополнение, вешать листенер на каждый элемент в холдере очень плахая практика, надо через свой интерфейс прокидивать позицию в адаптер.
источник

S

Sergey in StartAndroid Ru Chat
Артём
Так адаптер знает об изменениях списка. И биндит элементы под нужный position. Если Вам надо достать айтем согласно position, то из onBindViewHolder этот айтем нужно просто прокинуть в viewHolder. И он там будет актуальный.
Либо я не понял проблему.
Когда удаляю элемент в ресайклере, делаю это через DiffUtils. Для остальных ViewHolder-ов не вызываю notifyItem... Но в момент удаления, в адаптер поступает новый запускатель, у которого изменен список. И теперь если нажму на ячейку, где не вызвали notifyItem, данные не актуьные получу
источник

А

Артём in StartAndroid Ru Chat
Значит, что-то не так сделано. Диффутил должен все позиции обновлять.
источник

А

Алекс in StartAndroid Ru Chat
Артём
Значит, что-то не так сделано. Диффутил должен все позиции обновлять.
Не все, а только те которые изменились, но это не меняет того факта, что данные в адаптере должны быть актальны даже через диф утилс(это уже для Сергея)
источник

СП

Сергей П. in StartAndroid Ru Chat
Алекс
И небольшое дополнение, вешать листенер на каждый элемент в холдере очень плахая практика, надо через свой интерфейс прокидивать позицию в адаптер.
Я в tag холдера сую связанный объект - листенер один общий для всех его получает через getTag  и передает куда надо по слоям
источник

S

Sergey in StartAndroid Ru Chat
Артём
Значит, что-то не так сделано. Диффутил должен все позиции обновлять.
Почему... Там у остальных ячеек ничего не поменялось внешне. Для них не вызывается notifyItem. Однако мне надо прикинуть в них после удаления новый запускатель...
источник

А

Артём in StartAndroid Ru Chat
Что за новый запускатель? Зачем он и откуда? И зачем он в элементах, которые уже есть, забиндены и работают?
источник

А

Алекс in StartAndroid Ru Chat
Sergey
Почему... Там у остальных ячеек ничего не поменялось внешне. Для них не вызывается notifyItem. Однако мне надо прикинуть в них после удаления новый запускатель...
У тебя даже через дифутилс должен быть актальный лист в адаптере иначе у тебя косяк будет
источник

А

Алекс in StartAndroid Ru Chat
Дифутилс только считает элементы которые изменились и обновляет view,но адаптер он не трогает
источник

СП

Сергей П. in StartAndroid Ru Chat
Дифутилс в отд.потоке же.
источник

S

Sergey in StartAndroid Ru Chat
Начал делать через notifyItemRangeChanged(0, getItemCount(), SomeObj);

Но он вызывает весь onBindViewHolder на элементах, которые скрыта,  на которые видны нормально установит только запускатель. Подумал, может есть другой способ получше))
источник

А

Алекс in StartAndroid Ru Chat
Сергей П.
Дифутилс в отд.потоке же.
Да, верно, но как это влияет?
источник

СП

Сергей П. in StartAndroid Ru Chat
Синхронизировать надо изменения списка, что ли. А то пока он считает мы его еще стораз поменяем
источник

СП

Сергей П. in StartAndroid Ru Chat
Листадаптер это сам делает
источник