Android recyclerview обновить данные

Содержание
  1. Как обновить данные адаптера RecyclerView?
  2. Как обновить / обновить конкретный элемент в RecyclerView
  3. Обновить отдельный элемент
  4. пример
  5. Сбой RecyclerView при прокрутке при обновлении
  6. 2 ответа
  7. Русские Блоги
  8. Оптимизация производительности Android RecyclerView
  9. очертание
  10. Разделение обработки данных и просмотра привязки
  11. Оптимизация данных
  12. Оптимизация макета
  13. Shared RecycledViewPool
  14. RecyclerView предварительная выборка данных
  15. Увеличьте кэш RecyclerView
  16. Увеличьте дополнительное пространство, зарезервированное RecyclerView
  17. Сократить создание слушателей ItemView
  18. Оптимизировать работу слайдов
  19. Ручка обновления флеш
  20. Переработка ресурсов
  21. Продолжение:
  22. Конкретная реализация кода события щелчка RecyclerView
  23. 1. Установите событие нажатия и длительное нажатие для элемента
  24. 2. Установите события нажатия и длительного нажатия для любого элемента управления в элементе или элементе
  25. Конкретная реализация оптимизации прокрутки при прокрутке RecyclerView для загрузки изображений
  26. Ссылка ссылка
  27. Интеллектуальная рекомендация
  28. Многослойная презентацияViewController Jap
  29. Распечатать список с конца до головы
  30. Типы данных и переменные
  31. Python Daily Practice (4) -идиомы заполняют музыку

Как обновить данные адаптера RecyclerView?

В течение 4 дней я не могу понять, что именно происходит с обновлением адаптера RecyclerView .

После того, как я получу новый список продуктов, я попытался:

Обновите ArrayList из фрагмента, где создается recyclerView , установите новые данные для адаптера, затем вызовите adapter.notifyDataSetChanged() ; это не работает.

Создайте новый адаптер, как и другие, и он сработал для них, но никаких изменений для меня: recyclerView.setAdapter(new RecyclerViewAdapter(newArrayList))

Создайте метод в Adapter который обновляет данные следующим образом:

Затем я вызываю этот метод всякий раз, когда я хочу обновить список данных; это не работает.

Чтобы проверить, могу ли я каким-либо образом изменить recyclerView, и я попытался удалить хотя бы элемент:

Все оставалось как было.

Вот мой адаптер:

И я RecyclerView следующим образом:

Итак, как я действительно обновляю данные адаптера, чтобы отображать новые полученные элементы?

Обновление: проблема заключалась в том, что макет, где gridView выглядел следующим образом:

Затем я просто удалил LinearLayout и сделал FrameLayout качестве родительского макета.

Я работаю с RecyclerView, и работа по удалению и обновлению хорошо работает.

1) УДАЛИТЬ: Есть 4 шага, чтобы удалить элемент из RecyclerView

Эта строка кодов работает для меня.

2) ОБНОВЛЕНИЕ ДАННЫХ: Единственное, что мне нужно было сделать:

Вы должны были сделать все это в коде Actvity / Fragment, но не в коде адаптера RecyclerView.

Это то, что сработало для меня:

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

У вас есть 2 варианта: обновить пользовательский интерфейс от адаптера:

Или обновить его из самого recyclerView:

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

То когда я получаю данные

И обновление в моем адаптере

Вот и все, надеюсь, вы в восторге, когда вернетесь

Другой вариант – использовать diffutil . Он будет сравнивать исходный список с новым списком и использовать новый список в качестве обновления, если есть изменения.

В принципе, мы можем использовать DiffUtil для сравнения старых данных с новыми данными и позволить ему вызывать notifyItemRangeRemoved и notifyItemRangeChanged и notifyItemRangeInserted от вашего имени.

Быстрый пример использования diffUtil вместо notifyDataSetChanged:

Я делаю calclateDiff, работающий с mainthread, с его большим списком.

Обновить данные списка, gridview и recycliewiew

Самый лучший и самый классный способ добавления новых данных к данным

Источник

Как обновить / обновить конкретный элемент в RecyclerView

Я пытаюсь обновить конкретный элемент в .

Сказка: Каждый раз, когда пользователь нажимает на элемент, отображается . Пользователь может ввести текст, нажав кнопку ОК. Я хочу показать этот текст в этом элементе и показать невидимое — объявленное в XML и адаптер —

Я использовал эту функцию в положительной кнопке для обновления элемента:

Но этот код не только изменяет itemView в переданной позиции, но также изменяет некоторые другие itemView (ы)!

Как мне правильно изменить конкретный itemView, щелкнув по нему?

Читайте также:  Sideload launcher android tv apk

Вы можете использовать метод из класса RecyclerView.Adapter. Из документации:

Сообщите зарегистрированным наблюдателям, что позиция изменилась. Эквивалентно вызову notifyItemChanged (position, null) ;.

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

Поскольку у вас уже есть позиция, она должна работать на вас.

  • 9 Я уже использовал его, но если я хочу обновить позицию 0, он обновляет позицию 0, 9, 19, .
  • Извините, не поняла ваш комментарий. Какая позиция обновляется? 0, 9 или диапазон от 0 до 9?
  • Нет, это не диапазон, каждый раз, когда я обновляю элемент, он также обновляет ненужные элементы
  • @Learner Когда вы обновляете ViewHolder в позиции 0, он остается обновленным. RecyclerView будет перерабатывать этот ViewHolder и используйте его для позиции 9, чтобы вы видели эти изменения там. Я рекомендую вместо этого установить этот текст в onBindViewHolder () — таким образом, всякий раз, когда ViewHolder перерабатывается, вы можете проверить его положение и установить текст или сделать изображение видимым или что-то еще правильно.
  • @Cliabhach все еще та же проблема с внесением изменений в

Обновить отдельный элемент

  1. Обновите элемент данных
  2. Сообщите адаптеру об изменении с номером

пример

Измените пункт «Овцы» так, чтобы в нем говорилось «Я люблю овец».

Мой полный ответ с другими примерами здесь.

  • как это сделать, если я хочу, чтобы обновленные данные переключились наверх
  • @Choy, после обновления данных вы можете переместить их в индекс 0. См. Раздел «Перемещение одного элемента» этого элемента.

Добавьте измененный текст в список данных вашей модели

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

а затем я бы добавил элемент в эту конкретную позицию, как показано ниже:

Я пытаюсь реализовать это сейчас. Я дам вам отзыв, когда закончу!

  • 2 Вы делаете один дополнительный шаг. Просто замените элемент в позиции и вызовите элемент notifyItemChanged (position);
  • @toshkinl Как узнать, что данные поступают из JSONObject? без позиции?

Мне нужно решить эту проблему, поймав позицию элемента, который необходимо изменить, а затем в вызове адаптера

, это вызовет onBindViewHolder (держатель ViewHolder, позиция int) для этого конкретного элемента в этой конкретной позиции.

Для меня лично сработал способ использования методов адаптера recyclerview для обработки изменений в его элементах.

Это будет похоже на это: создать метод в вашем пользовательском представлении ресайклера примерно так:

Ниже решение сработало для меня:

В элементе RecyclerView пользователь нажмет кнопку, но другое представление, такое как TextView, будет обновляться без прямого уведомления адаптера:

Я нашел хорошее решение для этого без использования метода notifyDataSetChanged (), этот метод перезагружает все данные recyclerView, поэтому, если у вас есть изображение или видео внутри элемента, они будут перезагружены, и пользовательский интерфейс не будет хорошим:

Вот пример того, как щелкнуть значок ImageView like и обновить только один TextView (можно обновить больше видов таким же образом, что и тот же элемент), чтобы отобразить как обновление счетчика после добавления +1:

В вашем классе адаптера в методе onBindViewHolder установите для ViewHolder значение setIsRecyclable (false), как показано в приведенном ниже коде.

Проблема в том, что не предоставляет никаких методов, возвращающих индекс элемента.

Мой обходной путь — создать экземпляр карты для (element, position) s

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

когда элемент изменился,

Хорошо определить вспомогательный метод

Экземпляр карты ( Map posMap ) не обязательно. Если карта не используется, цикл по списку может найти позицию элемента.

Это тоже моя последняя проблема. В моем решении я использую модель данных и адаптер для моего RecyclerView

вам просто нужно добавить следующий код в диалоговое окно предупреждения при сохранении щелчка

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

Читайте также:  Получение root права андроид

В вашем адаптере RecyclerView у вас должен быть ArrayList, а также один метод для добавления элементов списка в ArrayList. Затем вы можете динамически добавлять элементы списка по телефону . После того, как все элементы вашего списка добавлены в ArrayList, вы можете позвонить по номеру , чтобы отобразить свой список.

Вы можете использовать в адаптере для RecyclerView

Источник

Сбой RecyclerView при прокрутке при обновлении

Я показываю некоторые статьи, полученные из WordPressAPI, в режиме ресайклера. Чтобы вызвать перезагрузку, я использую SwipeRefreshLayout. Когда пользователь перезагружается и прокручивается вниз, пока приложение загружает новые статьи, приложение вылетает, и я получаю следующую ошибку

Я храню статьи в пакетах по 10 (также известные как страницы из WordPress) в модели просмотра, вот код, который я использую для обновления данной страницы:

РЕДАКТИРОВАТЬ: я, вероятно, должен сказать, что нет ошибки, когда пользователь не прокручивает, приложение просто вылетает, когда пользователь прокручивает при перезагрузке

2 ответа

Извините, ошибка на самом деле была связана не с самим RecyclerView, а с другими частями моего кода: я всегда загружал страницы в заданную точку, все страницы после этого были удалены, что означает, что при загрузке нового Pages, значения, к которым RecyclerView хотел получить доступ, там, где они фактически не загружены.

Извините за кражу вашего времени

Несогласованность возникает, когда вы пытаетесь обновить представление ресайклера (recyclerAdapter.notifyItemChanged (id)), когда его последняя операция обновления еще не завершена.

Есть несколько вещей, которые не ясны из вопроса. Вы вызываете метод setArticlePage внутри цикла? Затем вы должны обновить вид ресайклера после завершения цикла.

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

Источник

Русские Блоги

Оптимизация производительности Android RecyclerView

очертание

RecyclerView обладает чрезвычайно высокой гибкостью и может реализовывать все функции ListView и GridView. В повседневной разработке он широко используется, и неправильное использование повлияет на общую производительность приложения, поэтому необходимо понять, как использовать его более эффективно.

Разделение обработки данных и просмотра привязки

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

топ onBindViewHolder Метод сравнивает дату и форматирует дату, это очень много времени, в onBindViewHolder В методе данные должны быть set На взгляд, и не следует обрабатывать бизнес.

Оптимизация данных

  1. Загружать удаленные данные на страницах и кэшировать извлеченные удаленные данные для повышения скорости вторичной загрузки;
  2. Для добавления или удаления данных через DiffUtil , Чтобы выполнить частичное обновление данных вместо вслепую обновления данных в глобальном масштабе.

DiffUtil Это новый класс инструментов в пакете поддержки, который используется для оценки разницы между новыми данными и старыми данными, чтобы выполнить частичное обновление.

Использование DiffUtil называется в оригинале mAdapter.notifyDataSetChanged() Место:

Наконец, DiffUtil вызывает следующие методы Адаптера для частичного обновления:

Оптимизация макета

Чтобы уменьшить уровень макета, вы можете рассмотреть возможность использования настраиваемого представления для снижения уровня или установить макет более разумно для снижения уровня.

Note: В настоящее время Не рекомендуется для использования в RecyclerView ConstraintLayout В версии 1.1.2 ConstraintLayout производительность все еще не очень хорошая. В последующих версиях эта проблема может быть решена и требует постоянного внимания.

Уменьшите время раздувания XML-файла

XML-файл включает в себя: макет, Drawable XML, ItemView извлекается из XML-файла с помощью трудоемких операций ввода-вывода. Вы можете использовать код для генерации макета, т.е. new View() Путь. Этот метод более проблематичен, но его можно использовать, когда макет слишком сложный или требования к производительности относительно высоки.

Сократить создание объектов View

Несколько более сложный элемент будет содержать большое количество представлений, а создание большого количества представлений займет много времени, поэтому необходимо максимально упростить ItemView: при разработке ItemType попытайтесь создать настраиваемое представление, чтобы уменьшить количество представлений, которые могут совместно использоваться несколькими представлениями. Строительство и гнездование.

Если высота элемента фиксирована, вы можете использовать RecyclerView.setHasFixedSize(true); Чтобы не тратить ресурсы в requestLayout.

Shared RecycledViewPool

Во вложенном RecyclerView, если дочерний RecyclerView имеет такой же адаптер, вы можете установить RecyclerView.setRecycledViewPool(pool) Чтобы поделиться RecycledViewPool.

Note: Если LayoutManager — LinearLayoutManager или его подклассы, вам необходимо вручную включить эту функцию: layout.setRecycleChildrenOnDetach(true)

Читайте также:  Как удалить аккаунт вконтакте через андроид

RecyclerView предварительная выборка данных

RecyclerView25.1.0 и выше были добавлены Prefetch Функция.

Используется для вложения RecyclerView для лучшей производительности.

Note: Подходит только для горизонтального размещения

Увеличьте кэш RecyclerView

Используйте пространство для времени, чтобы улучшить плавность прокрутки.

Увеличьте дополнительное пространство, зарезервированное RecyclerView

Дополнительное пространство: за пределами диапазона отображения должно быть дополнительное пространство кеша

Сократить создание слушателей ItemView

Установите прослушиватель для ItemView, не создавайте прослушиватель для каждого элемента, но он должен использовать XxListener, а затем в соответствии с ID Для выполнения различных операций оптимизируйте потребление ресурсов, вызванное частым созданием объектов.

Оптимизировать работу слайдов

Настроить RecyclerView.addOnScrollListener(); Для остановки операции загрузки во время процесса скольжения.

Ручка обновления флеш

При вызове notifyDataSetChange адаптер не знает, что находится во всем наборе данных и существует, и он будет мигать при повторном сопоставлении ViewHolder.

Установите adapter.setHasStableIds (true) и перепишите getItemId (), чтобы дать каждому элементу уникальный идентификатор

Переработка ресурсов

Переписав RecyclerView.onViewRecycled(holder) Чтобы вернуть ресурсы.

Продолжение:

Конкретная реализация кода события щелчка RecyclerView

1. Установите событие нажатия и длительное нажатие для элемента

При обычных обстоятельствах мы устанавливаем событие щелчка или долгое нажатие одним из следующих способов:

по Вышеприведенный метод прост и жесток, но если быстро перемещаются десятки тысяч данных, в памяти будет создано много объектов. Очевидно, что этот метод не очень хорош, и его нужно оптимизировать, как его оптимизировать? К счастью, rec предоставил мне метод addOnItemTouchListener:

Ну, здесь мы можем элегантно установить событие щелчка элемента для rec.

2. Установите события нажатия и длительного нажатия для любого элемента управления в элементе или элементе

Описанный ниже метод можно использовать для установки событий щелчков и длительных нажатий для элементов и любых элементов управления в элементах, но рекомендуется, чтобы вышеуказанный метод был более элегантным для настроек элементов. Ну, все же это предложение: если мы не выполним оптимизационную обработку, мы все равно установим событие для элемента управления с помощью вышеуказанного метода. Проблема та же, и оптимизация требуется. Код оптимизации выглядит следующим образом:

Таким образом, сколько объектов события щелчка будет создано в нашей памяти? После тестирования и обнаружения количество отображаемых экранов составляет +3 (некоторые не понимают, почему есть еще 3)
———————
Оригинал: https://blog.csdn.net/zhq217217/article/details/79082093

Конкретная реализация оптимизации прокрутки при прокрутке RecyclerView для загрузки изображений

Реализация: используйте обратный вызов onScrollStateChanged, чтобы определить состояние прокрутки, и установите значение состояния, аналогичное isScrolling, в RecyclerViewAdapter, чтобы управлять загрузкой сетевых изображений.
Ниже приведен пример кода:

Ссылка ссылка

Автор: кодирование на первой линии
Ссылка : https://www.jianshu.com/p/bd432a3527d6
Источник: Цзяньшу
Авторские права на простую книгу принадлежат автору. Пожалуйста, свяжитесь с автором для авторизации и укажите источник любого вида перепечатки.

Интеллектуальная рекомендация

Многослойная презентацияViewController Jap

. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.

Распечатать список с конца до головы

В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.

Типы данных и переменные

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

Python Daily Practice (4) -идиомы заполняют музыку

оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.

Источник

Оцените статью