Как сделать так, чтобы указанный элемент не обновлялся, когда notifyDataSetChanged в RecyclerView

У меня есть элемент в RecyclerView, который не нужно обновлять при вызове notifyDataSetChanged.

Но я не нашел никаких способов, чтобы указанный элемент не обновлялся. Можно ли сделать это ?


Мне нужно сделать это, потому что элемент WebView, он загрузил html-страницу, если я вызову notifyDataSetChanged, этот элемент будет мигать.

Причина, по которой я публикую этот вопрос, заключается в том, чтобы избежать вспышки WebView при notifyDataSetChanged (см. этот вопрос). После неудачного использования методов notifyItemRangeXXX размещаю этот вопрос.

Но после проверки ваших ответов и комментариев кажется, что избежать обновления при использовании notifyDataSetChanged невозможно.


person L. Swifter    schedule 29.07.2016    source источник
comment
если вы не хотите, чтобы он обновлялся, не меняйте источник данных   -  person Linh    schedule 29.07.2016
comment
Если это возможно, вы также можете использовать notifyItemChanged(pos) для других, кроме рассматриваемого элемента.   -  person Shaishav    schedule 29.07.2016
comment
Если вы используете RecyclerView.Adapter. Возможно, вы захотите рассмотреть методы notifyItemChanged(int position), notifyItemRangeChanged(int positionStart, int itemCount)   -  person Keyfe Ang    schedule 29.07.2016


Ответы (3)


Целью notifyDataSetChanged является обновление ВСЕХ элементов. Не используйте его, если вы не хотите такого поведения!

Правильным подходом будет обновление только тех данных, которые вы изменили. Есть несколько методов, которые помогут вам аннулировать только нужные данные:

notifyItemChanged(int position)
notifyItemInserted(int position)
notifyItemMoved(int fromPosition, int toPosition)
notifyItemRangeChanged(int positionStart, int itemCount)
notifyItemRangeRemoved(int positionStart, int itemCount)
notifyItemRemoved(int position)
person dipdipdip    schedule 29.07.2016

Да, это действительно возможно сделать. notifyDataSetChanged() уведомляет RecyclerView о том, что все элементы в наборе данных изменились.

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

for(int i = 0; i< mAdapter.getItemCount(); i++){
    if(i != itemPositionToExclude){
       mAdapter.notifyItemChanged(i);
    }
}

Итак, нам нужно перебрать все элементы в адаптере и вызвать notifyItemChanged() только для тех позиций which you do not want to exclude.

person Aritra Roy    schedule 29.07.2016

Вы должны думать по-другому - какие элементы нужно обновить. Чтобы обновить пользовательский интерфейс элемента после изменения данных, используйте метод уведомить об изменении элемента

person Divers    schedule 29.07.2016