только один или несколько элементов из списка?
if (element) {
holder.itemImage.setImageResource(R.drawable.img1)
} else {
holder.itemImage.setImageResource(pictures[position].image)
}
Так меняются все элементы. Но я не могу понять как поменять отдельный элемент. Подскажите куда копать, смотреть?
а как ты отличаешь этот отдельный элемент от остальных?
по позиции
ну значит нужно передать эту позицию в проверку условия. if(позиция) и т.д.
Я могу так сделать, но тогда слишком много условий придётся прописывать. А хочется, чтобы при element = true все отображались как img1 или img2. Но проблема в том, что все картинки либо img1 либо img2. А как в onBindViewHolder указать на отдельную позицию с учетом условия не совсем понимаю.
Там же ресайкла когда меняет один элемент, перестраивает весь список. И позиции соответственно тоже меняет, у остальных. Может не к позиции привязывать?
как-то не понятно ни что вы хотите ни в чем ваша проблема. рассказывайте что за element такой, покажите как должен выглядеть ресайклер
Хорошо. Похоже вопрос немного глубже чем я предполагал. Есть 1. recyclerView с текстом и картинкой 2. чекер element Изначально все картинки одинаковые (img1), но Если element от 0 до 100, то картинка на 1й позиции recyclerView меняется на img2, если от 101 до 200, то меняется картинка элемента 2й позиции. И так далее - в зависимости от диапазона меняются изображения у следующих элементов. В onBindViewHolder пытаюсь прописать условие, но не знаю как реализовать, чтобы только у первого элемента поменялось изображение. override fun onBindViewHolder(holder: ViewHolder, position: Int) { var element = 50 if (element < 100) { holder.itemImage.setImageResource(R.drawable.img1) //все изображения как img1 } else { ???? //как реализовать, чтобы только у первого элемента поменялось изображение?}} Может быть можно иначе реализовать этот алгоритм? Кроме как указывать самостоятельно диапазон я не вижу, голову сломал
Не до конца понимаю, что всё таки требуется holder.adapterPosition.toDouble().let { (it / 100).toInt() }
т.е. у всех элементов картинка1. если это самый первый элемент, то картинка2. Если 102 элемент, то картинка2. Если 203 элемент, то картинка2 ?
Да, по умолчанию у всех картинка1. img2 - это список со ссылками на разные картинки и получается, что если element = 0 если element в диапазоне от 1 до 100, то картинка 2 если element в диапазоне от 101 до 200, то картинка 3 если element в диапазоне от 0 до 100, то картинка 4
т.е. все элементы с 101 по 200 уже будут с картинкой2 ? все 100 штук?
when(holder.adapterPosition) { 1 -> img1 in 2..100 -> img2 ...
А как у тебя элемент может быть 0, 1—100 и 0-100 одновременно?
Не совсем. Заменю название переменной, чтобы не вводить в заблуждение. В списке 20 элементов. Если x in 1..100 то картинка 1го элемента меняется на картинку 1 Если x in 101..200 то картинка 2го элемента меняется на картинку 2 Если x in 201..300 то картинка 3го элемента меняется на картинку 3 и т.д.
x это количество элементов?
нет это просто число для условия
так х - это не номер айтема, а просто число любое? т.е. например у первого в списке может быть x = 125 ?
если элементов всего 20 то откуда тем может быть 101-200. Если элемент в диапазоне 101...200 то как он при этом может быть вторым. 103 что ли?
Элементов в списке 20. Число может быть любым.
а. ну так у тебя кол-во картинок все равно конечно, так что ручками прописать все диапазоны для всех имеющихся картинок это не так уже страшно. или как?
Это сделаю, но в onBindViewHolder не совсем представлю как прописать условие. Что-то типа when(x) { in 1..100 -> ???? in 101..200 -> ???? } Но каким образом указать на сам элемент?
это тебе тестовое задание дали такое? или что это за мозголомка вообще?
ты уже находишься в онбинде нужного элемента
val iconRes = when(x) { in 1..100 -> R.drawable.img1 in 101..200 -> R.drawable.img2 else -> R.drawable.img0 } imageview.setIamgeResource(iconRes)
😀 Это я делаю приложение. X - это количество опыта. И если его мало надо заблокировать элементы и повесить картинку. В зависимости от его увеличения - становятся кликательными элементы и меняется картинка
ресурсКАртинки = when{ x in 1..100 && position ==1 -> img1 x in 101..200 && position ==2 -> img2 } и делать то нужно в методе bind самого вьюхолдера, а не в onBindViewHolder адаптера. В onBindViewHolder адаптера нужно лишь вызывать метод bind вьюхолдера и передавать в него данные в качестве аргументов
а как понять что находишься в онбинде именно нужного элемента?
а какой то нужен? онбинд сработает на каждом же в он бинде делаешь: val item = sourceList(position) holder.bind(item)
вот на картинку посмотри
ресурсКАртинки = when{ x in 1..100 && position ==1 -> img1 x in 101..200 && position ==2 -> img2 } и делать то нужно в методе bind самого вьюхолдера, а не в onBindViewHolder адаптера. В onBindViewHolder адаптера нужно лишь вызывать метод bind вьюхолдера и передавать в него данные в качестве аргументов
посмотрел, что должен увидеть? простая задача же, поставить условие в зависимости от кондишна, в чем сложность то ?
ну вот для человека два условия на 20 элементов выглядит костылем и говнокодом. хочеть чтоб красивее
привязку к позиции я на картинке на вижу, только к значению икса
красными буквами на писано что на диапазон 100-200 реагирует только второй элемент, и больше никакой
другой вопрос что сама эта логика скорее всего неправильная и когда автор получит что хотел пойме что это не то чего он хотел ))
я думаю что ты не так понял, но мне все равно, автор ушел, а мы с тобой спорим) так что закрываем)
ну да, без его комментариев смысла нет
да, так и есть. Просто таких условий еще в других адаптерах будет куча...
Это некая особенность. Чувствую, что так себя в тупик загнал с этими условиями
выноси логику из адаптера во вьюхолдеры, как минимум это сделай
Это сделаю в любом случае. Просто в качестве примера решил туда запихнуть.
fun daFuckGetFuckingImage(fuckingX: Int) { return listOf(img1, img2).get((fuckingX.toDouble()/100).toInt()) }
Меня смутил факт того, что до ввода этих ограничений все картинки красиво подтягивались в онбинде одной строчкой в зависимости от позиции holder.itemImage.setImageResource(lessons[position].images) а теперь ручками всё прописывать
Модификация холдера вне холдера - ООП в целом и инкапсуляция в частности передают большой привет.
Вопрос решился в обход логики recyclerView. В отдельном методе в зависимости от опыта заменяются картинки. И подтягивается сразу то что нужно
Обсуждают сегодня