169 похожих чатов

Здравствуйте, подскажите как повесить условие в recyclerView так чтобы менялся

только один или несколько элементов из списка?

if (element) {
holder.itemImage.setImageResource(R.drawable.img1)
} else {
holder.itemImage.setImageResource(pictures[position].image)
}


Так меняются все элементы. Но я не могу понять как поменять отдельный элемент. Подскажите куда копать, смотреть?

45 ответов

24 просмотра

а как ты отличаешь этот отдельный элемент от остальных?

Vergilius-Kussenkov Автор вопроса

по позиции

ну значит нужно передать эту позицию в проверку условия. if(позиция) и т.д.

Vergilius-Kussenkov Автор вопроса

Я могу так сделать, но тогда слишком много условий придётся прописывать. А хочется, чтобы при element = true все отображались как img1 или img2. Но проблема в том, что все картинки либо img1 либо img2. А как в onBindViewHolder указать на отдельную позицию с учетом условия не совсем понимаю.

Там же ресайкла когда меняет один элемент, перестраивает весь список. И позиции соответственно тоже меняет, у остальных. Может не к позиции привязывать?

как-то не понятно ни что вы хотите ни в чем ваша проблема. рассказывайте что за element такой, покажите как должен выглядеть ресайклер

Vergilius-Kussenkov Автор вопроса

Хорошо. Похоже вопрос немного глубже чем я предполагал. Есть 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 ?

Vergilius-Kussenkov Автор вопроса

Да, по умолчанию у всех картинка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 одновременно?

Vergilius-Kussenkov Автор вопроса

Не совсем. Заменю название переменной, чтобы не вводить в заблуждение. В списке 20 элементов. Если x in 1..100 то картинка 1го элемента меняется на картинку 1 Если x in 101..200 то картинка 2го элемента меняется на картинку 2 Если x in 201..300 то картинка 3го элемента меняется на картинку 3 и т.д.

x это количество элементов?

Vergilius-Kussenkov Автор вопроса

нет это просто число для условия

так х - это не номер айтема, а просто число любое? т.е. например у первого в списке может быть x = 125 ?

если элементов всего 20 то откуда тем может быть 101-200. Если элемент в диапазоне 101...200 то как он при этом может быть вторым. 103 что ли?

Vergilius-Kussenkov Автор вопроса

Элементов в списке 20. Число может быть любым.

а. ну так у тебя кол-во картинок все равно конечно, так что ручками прописать все диапазоны для всех имеющихся картинок это не так уже страшно. или как?

Vergilius-Kussenkov Автор вопроса

Это сделаю, но в 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)

Vergilius-Kussenkov Автор вопроса

😀 Это я делаю приложение. 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 реагирует только второй элемент, и больше никакой

другой вопрос что сама эта логика скорее всего неправильная и когда автор получит что хотел пойме что это не то чего он хотел ))

я думаю что ты не так понял, но мне все равно, автор ушел, а мы с тобой спорим) так что закрываем)

ну да, без его комментариев смысла нет

Vergilius-Kussenkov Автор вопроса

да, так и есть. Просто таких условий еще в других адаптерах будет куча...

Vergilius-Kussenkov Автор вопроса

Это некая особенность. Чувствую, что так себя в тупик загнал с этими условиями

выноси логику из адаптера во вьюхолдеры, как минимум это сделай

Vergilius-Kussenkov Автор вопроса

Это сделаю в любом случае. Просто в качестве примера решил туда запихнуть.

fun daFuckGetFuckingImage(fuckingX: Int) { return listOf(img1, img2).get((fuckingX.toDouble()/100).toInt()) }

Vergilius-Kussenkov Автор вопроса

Меня смутил факт того, что до ввода этих ограничений все картинки красиво подтягивались в онбинде одной строчкой в зависимости от позиции holder.itemImage.setImageResource(lessons[position].images) а теперь ручками всё прописывать

Модификация холдера вне холдера - ООП в целом и инкапсуляция в частности передают большой привет.

Vergilius-Kussenkov Автор вопроса

Вопрос решился в обход логики recyclerView. В отдельном методе в зависимости от опыта заменяются картинки. И подтягивается сразу то что нужно

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта