NotifyItemChanged (int position) обновляет несколько элементов в RecyclerView

Я использую RecyclerView для отображения списка элементов, и мне нужно обновить состояние для одного элемента по позиции. Я обновляю свой элемент в списке, а затем вызываю notifyItemChanged (int position) следующим образом:

myList.set(position, newModifiedItem); notifyItemChanged(position); 

Элемент обновляется успешно, но также случайным образом обновляется некоторые другие элементы, и каждый раз, когда я просматриваю список вверх и вниз по списку товаров, это обновление (другое состояние значка) выполняется и на других элементах.

Я делаю изменения в onBindViewHolder где я проверяю элемент позиции по позиции и решаю установить другой статус.

Код полного адаптера:

 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<MyObj> myList; public MyAdapter(List<MyObj> list) { this.myList = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item, parent, false); return new ViewHolder(view); } public void onBindViewHolder(final ViewHolder holder, final int position) { MyObj myObj = myList.get(position); boolean isSpecial = myObj.getMySpecialStatus(); holder.myItemTitle.setText(myObj.getTitle()); //decide if item has different icon state if (isSpecial) { holder.myItemIcon.setImageResource(R.drawable.ic_special); } } @Override public int getItemCount() { return myList.size(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public TextView myItemTitle; public ImageView myItemIcon; public LinearLayout itemClickable; //some other views public ViewHolder(View itemView) { super(itemView); myItemTitle = (TextView) itemView.findViewById(R.id.item_title); myItemIcon = (ImageView) itemView.findViewById(R.id.item_img); itemClickable = (LinearLayout) itemView.findViewById(R.id.item_clickable_zone); itemClickable.setOnClickListener(this); //some other views } @Override public void onClick(View v) { final int position = getAdapterPosition(); if (position != RecyclerView.NO_POSITION) { switch (v.getId()) { case R.id.item_clickable_zone: { //some logic to change status - here just an idea MyObj newModifiedItem = myList.get(position); newModifiedItem.setMySpecialStatus(true); myList.set(position, newModifiedItem); notifyItemChanged(position); break; } //some other views on click } } } } } 

Проблема в вашем onBindViewHolder() где вы не использовали аргумент else case for if . Это будет выглядеть так:

 public void onBindViewHolder(final ViewHolder holder, final int position) { MyObj myObj = myList.get(position); boolean isSpecial = myObj.getMySpecialStatus(); holder.myItemTitle.setText(myObj.getTitle()); //decide if item has different icon state if (isSpecial) { holder.myItemIcon.setImageResource(R.drawable.ic_special); } else { //here is the trick - set normal state back holder.myItemIcon.setImageResource(R.drawable.ic_standard); } } 

Попробуй это,

 MyObj newModifiedItem = myList.get(position); //getting object from the list newModifiedItem.setMySpecialStatus(true); notifyItemChanged(position, newModifiedItem); 
Intereting Posts
Не удалось проверить подпись сертификата? OutOfMemoryException при передаче изображения камеры в OpenCV Каков код для получения обновленного токена Facebook в приложении для Android? Ошибка в Android Studio при запуске моего приложения Возможно ли получить количество загрузок приложения из Google Play? API Android Google Maps v2 – восстановление состояния карты При щелчке экрана виджет кнопки теряется Android: хотите установить пользовательские шрифты для всего приложения, а не для исполнения Установить currentItem viewPager из фрагмента Как использовать viewGroup в android Выражения с коммутатором должны быть постоянными выражениями Как мы можем обрабатывать ошибки HTTP, например: 401, 403, 404, 500 в android.webview? Как я могу добавить событие в календарь автоматически? Список стран Android с флагами и доступность для получения мобильных кодов iso Невозможно установить colorControlNormal и android: textColor в стиле