Android studio обновить recyclerview

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

пытаюсь выяснить в чем проблема с обновлением ‘ы.

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

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

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

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

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

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

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

и я инициирую RecyclerView as следует:

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

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

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

12 ответов

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

1) удалить: Есть 4 шага, чтобы удалить элемент из RecyclerView

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

2) ОБНОВЛЯТЬ ДАННЫЕ: Единственное, что я должен был сделать, это

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

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

  1. обновить набор данных
  2. уведомить адаптер об изменении

вставить один элемент

добавить «свинья» по индексу 2 .

вставить несколько элементов

вставить еще три животных по индексу 2 .

удалить один элемент

удалить «свинья» из списка.

удалить несколько элементов

удалить «верблюд» и «овцы» из списка.

удалить все элементы

очистить весь список.

заменить старый список на новый список

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

на adapter имеет ссылку на data , поэтому важно, чтобы я не установил data к новому объекту. Вместо этого я очистил старые элементы от data а затем добавил новые.

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

измените пункт » овцы «так, чтобы он говорил:» мне нравятся овцы.»

переместить один пункт

переместить «овец» из позиции 3 в положение 1 .

вот код проекта для вашей справки. Код адаптера RecyclerView можно найти по адресу ответ.

Примечания

  • если вы используете notifyDataSetChanged() , тогда анимация не будет выполнена. Это также может быть дорогим операции, поэтому не рекомендуется использовать notifyDataSetChanged() если вы обновляете только один элемент или диапазон элементов.
  • проверить DiffUtil если вы делаете большие или сложные изменения в список.

дальнейшего изучения

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

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

у вас есть 2 варианта для этого: обновление UI от адаптера:

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

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

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

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

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

Читайте также:  После обновления андроид не работает кнопка домой

обновлять данные listview, gridview и recyclerview

Я решил ту же проблему по-другому. У меня нет данных, которые я жду от фонового потока, поэтому начните со списка emty.

лучший и самый крутой способ добавить новые данные в настоящие данные —

я узнал, что действительно простой способ перезагрузить RecyclerView-просто позвонить

это сначала удалит все содержимое RecyclerView, а затем добавит его снова с обновленными значениями.

Я получил ответ после долгого времени

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

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

эти методы эффективны и хороши для начала использования basic RecyclerView .

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

Источник

Динамическое обновление определенного представления в RecyclerView

В настоящее время я работаю на Android, используя RecyclerView , скажем, у меня есть 2 TextView в моей пользовательской строке, я хотел динамически изменить текст одного в TextView , как я могу сделать который?

У меня есть следующий код в моей MainActivity

В моем классе адаптеров

Я понятия не имею, чтобы сделать это. , , Кто-нибудь может мне помочь?

Пожалуйста, посмотрите на мои изменения,

1: Я хочу обновить один из TextView внутри класса MainActivity , вызвав updateSpecificViewItem(«theID») .

2: Получить позицию базы предметов на заданном id , вызвав getPositionBaseOnItemID(«theID») .

3: чтобы наконец обновить конкретный элемент, я хочу вызвать метод updateTextView(int position) .

Единственная проблема, с которой я сейчас сталкиваюсь, это number 3 , как я могу обновить только text2 , а не весь элемент?

4 ответа

Решая мою проблему

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

Спасибо всем, кто дал мне идею notifyItemChanged() ! надеюсь, это поможет и другим.

Вам необходимо переопределить onBindViewHolder (держатель TheViewHolder, позиция int, полезная нагрузка списка)

И чтобы обновить ваш textView вам просто нужно позвонить

adapter.notifyItemChanged(position , «an string for example»)

Это дает вам частичное обновление вашего взгляда.

Надеюсь это поможет.

Создайте общедоступную статику в классе RecylerView, просто назначьте текст в этом методе. Далее, в классе, где вы подключаетесь к экземпляру представления переработчика, обязательно добавьте интерфейс onclick и ontouch для сохранения положения выбранной строки текста. Используйте экземпляр представления переработчика для вызова notifyItemChanged .

Вот описание из документации.

notifyItemChanged добавлен в версию 22.1.0

Void notifyItemChanged (int position)

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

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

Источник

Android studio обновить recyclerview

Add, Remove and Update RecyclerView Items In Android Studio

  • Post author:admin
  • Post published: July 7, 2019
  • Post category:ANDROID / HOME
  • Post comments:0 Comments

Android RecyclerView provides advanced and powerful features to display a large amount of data in your app. In this article, we learn How To Add, Remove, and Update Items In Android RecyclerView with the help of an example.

Here are resources, which help you to learn more about Android RecyclerView.

In this tutorial, we work for the following solution with the help of an example in Android Studio:

  • How to Add and Remove RecyclerViewItems In Android Studio.
  • How to UpdateRecyclerViewItems In Android Studio.

Features Of Application

  • Display the list of items in RecyclerView.
  • Add a New Item in RecyclerView on the click of a button.
  • Remove an item from the RecyclerView on the click of an item button.
  • Update an item of the RecyclerView on click of the update button.
Читайте также:  Icon theme packs android

Demo

Create A New Project

Before Implementing the following code first create a new project in Android Studio, go to File => then go to New => then select the New Project option. In Add an activity option select default activity(Blank Activity) and proceed.

Structure Of Code

The following image is showing the project structure. Total three java files I have created over here MainActivity, Model, and RvAdapter similarly total two XML files created one for MainActivity that is “activity_main.xml” and another for RecyclerView item that is “item_list.xml“.

Code

Code for build.gradle (Module: app )

Add the following two additional libraries in dependencies of your build.gradle (Module: app ):

  • implementation ‘com.android.support:recyclerview-v7:28.0.0’
  • implementation ‘com.google.code.gson:gson:2.8.2’

Code for AndroidManifest.xml file .

The following code is for the android application Manifest File which is available in your project root directory. The manifest file defines the project structure this is a very important part of the application.

Code for MainActivity.java file.

This is the main activity of the application where we implement the complete functionality like:

  • Android RecyclerView implementation.
  • Insert New Item in Recyclerview on click of Add button.
  • Delete Item of RecyclerView on click of cancel button of the item.
  • Enable the update option on click of RecyclerView item.
  • Update the item of RecyclerView on click of Update button.

Code for the activity_main.xml file.

The following XML code is for the main UI of the application. In this layout add the RecyclerView widget and all the views to handle the functionality.

Code for Model.java file.

Now we create a model class to hold our new inserted data and also add the getter/setter methods for all the variables which are defined in this class.

Code for RvAdapter.java file.

This source code for the adapter class which helps in render the data.

Code for the item_list.xml file.

This is your one item layout of RecyclerView which helps to display a large number of the data list. In this item UI, I have defined a TextView with id “tv_name” to display a name and an ImageView with id “img_remove” to display a cancel icon on this icon perform an action to remove that particular item of RecyclerView.

Источник

RecyclerView

Компонент RecyclerView появился в Android 5.0 Lollipop и находится в разделе Containers. Для простоты буду называть его списком, хотя на самом деле это универсальный элемент управления с большими возможностями.

Раньше для отображения прокручиваемого списка использовался ListView. Со временем у него обнаружилось множество недостатков, которые было трудно исправить. Тогда решили создать новый элемент с нуля.

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

Схематично работу RecyclerView можно представить следующим образом. На экране отображаются видимые элементы списка. Когда при прокрутке списка верхний элемент уходит за пределы экрана и становится невидимым, его содержимое очищается. При этом сам «чистый» элемент помещается вниз экрана и заполняется новыми данными, иными словами переиспользуется, отсюда название Recycle.

Компонент RecyclerView не является родственником ListView и относится к семейству ViewGroup. Он часто используется как замена ListView, но его возможности шире.

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

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

Для размещения своих дочерних элементов используется специальный менеджер макетов LayoutManager. Он может быть трёх видов.

  • LinearLayoutManager — дочерние элементы размещаются вертикально (как в ListView) или горизонтально
  • GridLayoutManager — дочерние элементы размещаются в сетке, как в GridView
  • StaggeredGridLayoutManager — неравномерная сетка
Читайте также:  Андроид использование карты памяти

Можно создать собственный менеджер на основе RecyclerView.LayoutManager.

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

ItemAnimator — отвечает за анимацию элементов при добавлении, удалении и других операций.

RecyclerView.Adapter связывает данные с компонентом и отслеживает изменения.

  • notifyItemInserted(), notifyItemRemoved(), notifyItemChanged() — методы, отслеживающие добавление, удаление или изменение позиции одного элемента
  • notifyItemRangeInserted(), notifyItemRangeRemoved(), notifyItemRangeChanged() — методы, отслеживающие изменение порядка элеметов

Стандартный метод notifyDataSetChanged() поддерживается, но он не приводит к внешнему изменению элементов на экране.

Программисты со стажем знают, что для создания «правильного» ListView нужно было создавать класс ViewHolder. В старых списках его можно было игнорировать. Теперь это стало необходимым условием.

Общая модель работы компонента.

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

Размещаем компонент в макете экрана через панель инструментов. Но сначала добавим зависимость.

Создадим макет для отдельного элемента списка. Варианты могут быть самыми разными — можно использовать один TextView для отображения строк (имена котов), можно использовать связку ImageView и TextView (имена котов и их наглые морды). Мы возьмём для примера две текстовые метки. Создадим новый файл res/layout/recyclerview_item.xml.

Добавим компонент в разметку экрана активности.

Минимальный код для запуска.

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

Начнём по порядку, чтобы запомнить последовательность. Для начала создадим обычный класс и в конструкторе передадим список строк. Список будет содержать имена котов.

Класс MyViewHolder на основе ViewHolder служит для оптимизации ресурсов. Новый класс добавим в состав нашего созданного ранее класса.

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

Создадим адаптер — наследуем наш класс от класса RecyclerView.Adapter и в качестве параметра указываем созданный нами MyViewHolder. Студия попросит реализовать три метода.

getItemCount()

Как правило данные являются однотипными, например, список или массив строк. Адаптеру нужно знать, сколько элементов нужно предоставить компоненту, чтобы распределить ресурсы и подготовиться к отображению на экране. При работе с коллекциями или массивом мы можем просто вычислить его длину и передать это значение методу адаптера getItemCount(). В простых случаях мы можем записать код в одну строчку.

onCreateViewHolder

В методе onCreateViewHolder нужно указать идентификатор макета для отдельного элемента списка, созданный нами ранее в файле recyclerview_item.xml. А также вернуть наш объект класса ViewHolder.

onBindViewHolder()

В методе адаптера onBindViewHolder() связываем используемые текстовые метки с данными — в одном случае это значения из списка, во втором используется одна и та же строка.

Должно получиться следующее.

Подключаем в активности. Создадим пока бессмысленный список строк, который передадим в адаптер.

Запускаем ещё раз.

Вариант с числами нам не интересен, поэтому добавим котов. Имена котов и кошек разместим в ресурсах в виде массива в файле res/values/strings.xml.

Создадим новую функцию для получения списка котов из ресурсов и передадим его адаптеру.

Горизонтальная прокрутка

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

А можно вообще обойтись только XML-декларацией.

Оптимизация

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

При работе с изображениями старайтесь использовать готовые библиотеки Picasso, Glide, Fresco и т.д.

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

Не перегружайте лишним кодом метод onBindViewHolder(). Только самое необходимое.

Источник

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