Похоже, что позиция в 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" />
попробуй выложить полный код адаптера и не ставь... может баг в том, о чем ты вообще не думаешь
Ну, это происходит и в ListView
, и в RecyclerView
. Вам нужно установить начальные переменные в случае отсутствия значения.
Android recyclerview использует ячейку повторно, что означает, что если вы прокрутите вниз, то память 1-й позиции будет повторно использована для другого элемента, поэтому это вызывает у вас проблемы. Сначала добавьте держатель.oneIcon.setVisiblity(View.GONE); и держатель.otherIcon.setVisiblity(View.GONE);, если условие bindview и выполните то же самое для других. Это определенно поможет вам.
добавить onItemChanged после настройки видимости
@tejraj Спасибо, это объяснение помогло мне понять.
Измените его таким образом,
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
вы должны управлять другими представлениями также при изменении элемента.
можете ли вы поделиться xml вашего предмета ресайклера