Установка другого цвета для некоторых элементов сетки

Я хочу установить другой цвет фона элемента сетки в зависимости от погоды, в которой модель для этого элемента имеет какое-то логическое значение, равное true или false. Итак, в моем методе onBindViewHolder в моем MyRecyclerviewAdapter я проверяю:

if (current.hasWiki()) {
        holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
    } 

Когда вид сетки ресайклера загружен, он выглядит нормально, элементы с hasWiki == true окрашены в зеленый цвет, а с hasWiki == false - совсем не окрашены. Но когда я прокручиваю вниз и эти неокрашенные элементы больше не отображаются на экране, я снова прокручиваю вверх, и эти элементы, которые должны быть неокрашенными, теперь окрашены в зеленый цвет. Все испорчено.

Это мой MyViewHolder:

public MyViewHolder(View itemView) {
        super(itemView);
        linearLayout = (LinearLayout)itemView.findViewById(R.id.rootLayout);
}

Итак, как я могу исправить это нежелательное поведение? Есть ли другой способ установить другой цвет для элементов recyclerview на основе некоторого произвольного флага?

0
0
75
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Измените это:

if (current.hasWiki()) {
    holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} 

к этому:

if (current.hasWiki()) {
    holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} else {
    holder.linearLayout.setBackgroundColor(/* default color here */);
}

Когда вы имеете дело с RecyclerView, важно понимать, что ваши ViewHolder будут переработанный и повторно использованный. Поэтому, если вы когда-нибудь хотите, чтобы что-то происходило «иногда», вам нужно убедиться, что вы всегда устанавливаете состояние по умолчанию, когда «иногда» не происходит.

Это природа повторного использования представлений или даже когда вы используете старый подход с обычными представлениями списков. Проблема, с которой вы столкнулись, заключается в том, что вы фактически не перерабатываете представление. Представление ресайклера будет передано в держатели представлений, которые содержат старые представления, которые необходимо переработать. Другими словами, при прокрутке вы будете получать представления, которые ранее были настроены на зеленый цвет, а теперь должны быть установлены на белый (или любой другой цвет, который вы хотите). Помните, что нет гарантии, что если вы ранее получали держатель представления для представления xyz, в следующий раз при прокрутке к этому представлению вы получите тот же держатель. Он может быть другим.

Немного логики, которую вы показываете:

if (current.hasWiki()) {
    holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} 

правильно, но как насчет предметов, которые вы перерабатываете, и у них должен быть белый фон (или любой другой цвет, если на то пошло)? Они не установлены, но должны быть.

if (current.hasWiki()) {
    holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} else {
    holder.linearLayout.setBackgroundColor(Color.WHITE);
}

Таким образом вы гарантируете, что фон для каждого вида будет правильно переработан. Теперь то, что здесь сказано для фона, справедливо для любого представления в держателе представления, включая изображения - они должны быть правильно установлены, так называемые переработанные - вот почему это называется повторным представлением.

вам нужно добавить оператор else в свой метод onBindViewHolder ()

if (current.hasWiki()) {
    holder.linearLayout.setBackgroundColor(0xCCF0FCC0);
} else{
    holder.linearLayout.setBackgroundColor(Color.TRANSPARENT);
}

Другие вопросы по теме

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