Android studio update listview

Как обновить Android listview?

Как обновить Android ListView после добавления/удаления динамических данных?

25 ответов

вызов notifyDataSetChanged() на Adapter объект после изменения данных в этом адаптере.

некоторые дополнительные сведения о том, как/когда звонить notifyDataSetChanged() можно посмотреть в это Google I / O видео.

также вы можете использовать это:

Пожалуйста, игнорируйте все invalidate() , invalidateViews() , requestLayout() , . ответы на этот вопрос.

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

устранение неисправностей

если вызов notifyDataSetChanged() не работает все методы компоновки не помогло. Поверьте мне ListView был должным образом обновлен. Если вам не удается найти разницу, вам нужно проверить, где данные в вашем адаптере от.

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

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

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

ArrayAdapter vs BaseAdapter

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

UI Thread

это верно, что это должно быть вызвано из потока UI. Другие ответы содержат примеры того, как этого достичь. Однако это требуется только в том случае, если вы работаете над этой информацией вне потока пользовательского интерфейса. Это из службы или не потока пользовательского интерфейса. В простых случаях вы будете обновлять свои данные с помощью нажатия кнопки или другого действия / фрагмента. Так что все еще в потоке UI. Не нужно всегда вставлять этот runOnUiTrhead.

Быстрый Пример Проекта

можно найти в https://github.com/hanscappelle/so-2250770.git. Просто клонируйте и откройте проект в Android Studio (gradle). Этот проект имеет MainAcitivity здание ListView со всеми случайными данными. Этот список можно обновить с помощью меню действий.

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

Источник

Android: как обновить содержимое ListView?

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

Я пробовал позвонить invalidateViews() , notifyDataSetChanged() и notifyDataSetInvalidated() . Мой код выглядит примерно так:

9 ответов

Тем, у кого все еще есть проблемы, я решил это так:

Сначала я очистил данные от адаптера, затем добавил новую коллекцию элементов и только потом установил notifyDataSetChanged(); Сначала мне это было непонятно, поэтому я хотел указать на это. Обратите внимание, что без вызова notifyDataSetChanged() представление не будет обновлено.

Насколько я понимаю, если вы хотите обновить ListView сразу после изменения данных, вам следует вызвать notifyDataSetChanged() в RunOnUiThread() .

Читайте также:  Word для андроида все

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

Чтобы прояснить это, ваша Activity должна выглядеть так:

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

Если вы замените адаптер или включите адаптер снова и снова при обновлении списка, то ошибка принудительного закрытия наверняка вызовет проблемы в какой-то момент. (Ошибка: данные списка обновлены, но адаптер не уведомляет представление списка)

Я тоже пробовал invalidate (), invalidateViews (), notifyDataSetChanged (). Все они могли работать в определенных контекстах, но в моем случае это не помогло.

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

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

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

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

Таким образом, мы не теряем много, но многое приобретаем.

Я делаю то же самое, используя invalidateViews (), и у меня это работает. Если вы хотите, чтобы он немедленно стал недействительным, вы можете попробовать вызвать postInvalidate после вызова invalidateViews.

Обновите содержимое ListView с помощью кода ниже:

onCreate () :

onDataGet (после вызова веб-службы, из локальной базы данных или другого источника):

BaseAdapter :

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

Готово

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

Источник

Android ListView обновить

У меня есть Listview который тянет и отображает данные из базы данных sqlite. Данные в первом столбце БД отображаются в ListView и при нажатии, Activity начинает показывать остальную часть столбца, связанного с первым столбцом. Когда данные редактируются, ListView необходимо обновить, чтобы отразить это, но он не показывает обновления, если приложение не перезапущено.

Я попытался вызвать, notifyDataSetChanged() и startActivityForResult() в моем onResume() но это не сработало. Какой метод следует использовать для выполнения обновления ListView в моем текущем коде?

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

Это то, для чего отлично подходит Loader . Я предлагаю вам создать SimpleCursorAdapter для привязки БД к пользовательскому интерфейсу ( ListView в этом случае), ContentProvider для взаимодействия с БД и CursorLoader для мониторинга БД для изменений и обновления интерфейса при необходимости. Loader будет обрабатывать все изменения базы данных и обновлять ListView , просто обновляя ваш адаптер. Похоже, что много работы впереди, но невероятно мощно настроено и будет работать через весь жизненный цикл Android.

Читайте также:  Backup your files android

Эти учебные пособия должны быть полезными:

редактировать

Вы теряете ссылку на свой список, почему ваш список не обновляется …

Сделайте это изменение в своем коде. 1. Инициализируйте свой ArrayList, когда он объявлен (глобально).

Непосредственно задайте список назначений для адаптера (onCreate)

LoginListAdapter = новый ArrayAdapter (это, android.R.layout.simple_list_item_1, loginArrayList);

onCreate() в onCreate() .

  • В вашем populateList() вместо добавления данных в новый список добавьте существующий список, связанный с вашим адаптером, т.е. loginArrayList
  • Если ваш список является полностью новым вызовом adapter.clear() и loginArrayList.clear() в loginArrayList.clear() populateList() перед добавлением данных в loginArrayList . После добавления данных в loginArrayList call adapter.notifyDataSetChanged()

    Это должно работать …

    1. Не выполняйте цикл, чтобы загрузить список. Если это простой список со всеми строками. Попробуйте использовать SimpleCursorAdapter и сделает ваше приложение более быстрым и коротким.
    2. После того, как вы обновите базу данных, то, что вы делаете, это запрос БД для получения Cursor и использования Adapter . swapCursor(newCursor) . Это обновит ваш список, сохранив положение прокрутки.

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

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

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

    Сначала создайте имя адаптера «ListAdapterItem.java»

    И вот мой data_list_item

    И основной класс «Main.java»

    Укажите свой идентификатор каждого списка в списке, надеясь, что этот ответ на ваш вопрос

    Я думаю, что в вашем методе populate () перед блоком while вы должны вызвать loginListAdapter.notifyDataSetChanged () и loginListAdapter.clear (); Это позволит очистить адаптер и обратить внимание на новый список данных.

    Блок будет выглядеть так:

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

    Попробуйте этот код

    В публичной области добавить переменную: List arrayList = new ArrayList ();

    И в onCreate () добавьте это:

    // затем добавим переменную в адаптер, как это

    Источник

    Как динамически обновить ListView на Android [закрыто]

    на Android, как я могу a ListView что фильтры на основе пользовательского ввода, где элементы, показанные обновляются динамически на основе TextView значение?

    Я ищу что-то вроде этого:

    3 ответов:

    во-первых, вам нужно создать XML-макет, который имеет как EditText, так и ListView.

    это будет выложить все правильно, с хорошим EditText над ListView. Затем создайте ListActivity как обычно, но добавьте setContentView() вызов в onCreate() метод поэтому мы используем наш недавно объявленный макет. Помните, что мы идентифицировали ListView специально, с android:id=»@android:id/list» . Это позволяет ListActivity чтобы знать, какой ListView мы хотим использовать в нашем объявлены макет.

    запуск приложения теперь должен показать ваш предыдущий ListView , С красивую коробку. Чтобы заставить это поле что-то сделать, нам нужно взять вход из него и сделать этот входной фильтр списком. Хотя многие люди пытались сделать это вручную,большинство ListView Adapter классы поставляются с Filter объект, который может быть использован для выполнения фильтрации автоматически. Нам просто нужно передать вход из EditText на Filter . Оказывается, что есть довольно легкий. Чтобы выполнить быстрый тест, Добавьте эту строку в свой onCreate() вызов

    Читайте также:  Android certpathvalidatorexception trust anchor

    обратите внимание, что вам нужно будет сохранить ваш ListAdapter к переменной, чтобы сделать эту работу — я сохранил мой ArrayAdapter ранее в переменную под названием «адаптер».

    следующий шаг-получить входные данные от EditText . Это на самом деле занимает немного подумал. Вы можете добавить OnKeyListener() на EditText . Однако, этот слушатель получает только какие-то ключевые события. Например, если пользователь вводит «wyw», прогнозирующий текст, вероятно, будет рекомендовать «глаз». Пока пользователь выбирает ‘wyw’ или ‘глаз’, код OnKeyListener не получит ключевое событие. Некоторые могут предпочесть это решение, но я нашел его разочаровывающим. Я хотел каждое ключевое событие, поэтому у меня был выбор фильтрации или не фильтрации. Решение-это TextWatcher . Просто создайте и добавьте TextWatcher до EditText и передать ListAdapter Filter запрос фильтра при каждом изменении текста. Не забудьте удалить TextWatcher in OnDestroy() ! Вот окончательное решение:

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

    Источник

    Как обновить ListView в Android?

    Как обновить Андроид ListView с после добавления/удаления динамических данных?

    Звоните notifyDataSetChanged() на объект свой «адаптер», как только вы’вэ изменил данные в адаптер.

    Некоторые дополнительные подробности о как/когда нужно позвонить notifyDataSetChanged () можно ознакомиться в это Google ввода/вывода видео.

    Также вы можете использовать это:

    Пожалуйста, игнорируйте все признать недействительными() , invalidateViews() , requestLayout()`, . ответы на этот вопрос.

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

    Устранение

    Если позвонить notifyDataSetChanged() не’t работа все методы компоновки выиграл’т помочь, либо. Поверьте ListView не была должным образом обновлена. Если вы не в состоянии найти разницу нужно проверить, где данные в ваш адаптер поставляется из.

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

    Если вы’вновь работает с базой данных и серверных сервисов вы’ll должны вызвать метод для получения информации (или манипулировать в памяти) прежде чем вызвать notifyDataSetChanged()`.

    Дело в том, что notifyDataSetChanged работает только если набор данных был изменен. Итак, это место, чтобы посмотреть, если вы не’т найти изменения идет. Отладка в случае необходимости.

    Адаптер массива против BaseAdapter

    Я нашел, что работает с адаптером, что позволяет управлять коллекцией, как BaseAdapter работает лучше. Некоторые адаптеры как адаптер массива уже управлять своим собственные коллекции, делая это тяжелее, чтобы добраться до надлежащего сбора для обновления. Это’s действительно просто излишне дополнительный уровень сложности, в большинстве случаев.

    UI-потоке

    Правда, это должен быть вызван из потока пользовательского интерфейса. Другие ответы есть примеры о том, как достичь этого. Однако это требуется только если вы’re работая на эту информацию вне потока пользовательского интерфейса. Это из службы или не поток пользовательского интерфейса. В простых случаях вы’ll быть обновление данных от нажатия кнопки или другой вид деятельности/фрагмент. Так до сих пор в потоке пользовательского интерфейса. Нет необходимости всегда будет появляться что runOnUiTrhead в.

    Быстрый Пример Проекта ##

    Можно найти на https://github.com/hanscappelle/so-2250770.git. Просто клон и открываем проект в Android студия (Gradle в). Этот проект имеет MainAcitivity блок управления ListView со всеми случайными данными. Этот список может быть обновлен с помощью меню действий.

    Реализация адаптера я создал для этого примера ModelObject выставляет сбора данных

    Источник

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