Позиция в recylerview меняется при прокрутке

Похоже, что позиция в recylerview меняется при прокрутке.

То, что я хочу сделать, похоже на это.

Adapter.java

@Override
public void onBindViewHolder(aViewHolder holder, int position) {

    if (position == 0) {
        holder.zeroIcon.setVisibility(View.VISIBLE);
    } else if (position == 1) {
        holder.oneIcon.setVisiblity(View.VISIBLE);
    } else {
        holder.otherIcon.setVisiblity(View.VISIBLE);
    }

    // Set text on each item
    ...
}


@Override
public int getItemCount() { return models.size(); }

public class aViewHolder extends RecyclerView.ViewHolder {

    private ImageView zeroIcon;
    private ImageView oneIcon;
    private ImageView otherIcon;


    public aViewHolder(View itemView) {
        super(itemView);
        zeroIcon = itemview.findViewById(...);
        ...
    }
}

Я установил видимость этих значков GONE по умолчанию в xml файле.

Когда я сначала вижу recylerview, значки отображаются так, как я и ожидал, в зависимости от их положения.

Однако, когда я прокручиваю вниз и прокручиваю вверх, неправильные значки также отображаются в неправильном положении. Нравится otherIcon появляется на первом и втором элементе при прокрутке вниз и вверх. При прокрутке вниз zeroIcon и oneIcon появляются на некоторых других элементах.

Как я могу это исправить?

list_item.xml вот так.

<RelativeLayout ...>

     <ImageView
         android:id = "@+id/zero"
         android:visiblity = "gone"
         android:background = "@drawable/zero" />

     <ImageView
         android:id = "@id/one"
         android:visiblity = "gone"
         android:background = "@drawable/one" />

     <ImageView
         android:id = "@id/other"
         android:visiblity = "gone"
         android:background = "@drawable/other" />

можете ли вы поделиться xml вашего предмета ресайклера

Muzammil Husnain 29.05.2019 10:36

попробуй выложить полный код адаптера и не ставь... может баг в том, о чем ты вообще не думаешь

Radesh 29.05.2019 10:38

Ну, это происходит и в ListView, и в RecyclerView. Вам нужно установить начальные переменные в случае отсутствия значения.

c-an 29.05.2019 10:39

Android recyclerview использует ячейку повторно, что означает, что если вы прокрутите вниз, то память 1-й позиции будет повторно использована для другого элемента, поэтому это вызывает у вас проблемы. Сначала добавьте держатель.oneIcon.setVisiblity(View.GONE); и держатель.otherIcon.setVisiblity(View.GONE);, если условие bindview и выполните то же самое для других. Это определенно поможет вам.

tejraj 29.05.2019 10:42

добавить onItemChanged после настройки видимости

Atif AbbAsi 29.05.2019 10:55

@tejraj Спасибо, это объяснение помогло мне понять.

Ooto 29.05.2019 10:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
6
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Измените его таким образом,

if (position == 0) {
    holder.zeroIcon.setVisibility(View.VISIBLE);
    holder.otherIcon.setVisiblity(View.GONE);
    holder.oneIcon.setVisiblity(View.GONE);
} else if (position == 1) {
    holder.oneIcon.setVisiblity(View.VISIBLE);
    holder.zeroIcon.setVisibility(View.GONE);
    holder.otherIcon.setVisiblity(View.GONE);
} else {
    holder.otherIcon.setVisiblity(View.VISIBLE);
    holder.oneIcon.setVisiblity(View.GONE);
    holder.zeroIcon.setVisibility(View.GONE);
}

В RecyclerView вы должны управлять другими представлениями также при изменении элемента.

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