- notifyDataSetChange не работает с пользовательского адаптера
- 7 ответов:
- Android ListView не обновляется после notifyDataSetChanged
- NotifyDataSetChanged () не обновляющий адаптер
- Русские Блоги
- Android Adapter.notifyDataSetChanged () изменяет данные, но не обновляет
- Интеллектуальная рекомендация
- Многослойная презентацияViewController Jap
- Распечатать список с конца до головы
- Типы данных и переменные
- Python Daily Practice (4) -идиомы заполняют музыку
- Лучший способ обновить адаптер / ListView на Android
notifyDataSetChange не работает с пользовательского адаптера
когда я снова заселяю мой ListView , Я вызываю определенный метод из моего Adapter .
когда я называю updateReceiptsList от меня Adapter , то данные обновляются, но мой ListView не отражает изменения.
вопрос:
почему мой ListView показать новые данные, когда я называю notifyDataSetChanged ?
адаптер:
нашли Обходной путь
просто чтобы иметь какой-то функциональный код, который я делаю сейчас:
работает, но не так, как это должно работать.
7 ответов:
таким образом, вы сохраняете тот же объект, что и ваш набор данных в адаптере.
у меня такая же проблема, и я понимаю, что. Когда мы создаем адаптер и устанавливаем его в listview, listview будет указывать на объект где-то в памяти, который держит адаптер, данные в этом объекте будут отображаться в listview.
если мы создадим объект для адаптера с другими данными снова и notifydatasetchanged ():
это не повлияет на данные в listview, потому что список указывает на другой объект, этот объект ничего не знает о новом объект в адаптере и notifyDataSetChanged () не влияют ни на что. Поэтому мы должны изменить данные в объекте и не создавать новый объект снова для адаптера
как я уже объяснил причины этой проблемы, а также как ее обрабатывать в другом потоке ответов здесь. Тем не менее я делюсь резюме решения здесь.
одна из главных причин notifyDataSetChanged() не будет работать для вас — это,
ваш адаптер теряет ссылку на ваш список.
при создании и добавлении нового списка Adapter . Всегда следуйте этим рекомендациям:
- инициализировать arrayList при объявлении его глобально.
- добавить список к адаптеру напрямую без проверки на null и пустой ценности. Установите адаптер в список напрямую (не проверяйте наличие состояние.) Адаптер гарантирует вам, что везде, где вы делаете изменения в данных arrayList Он позаботится о нем, но никогда не потеряет ссылка.
- всегда изменяйте данные в самом arrayList (если ваши данные совершенно новые чем вы можете назвать adapter.clear() и arrayList.clear() до фактически добавление данных в список), но не устанавливайте адаптер, т. е. если новые данные заполняются в arrayList чем просто adapter.notifyDataSetChanged()
надеюсь, что это помогает.
может быть, попробуйте обновить ListView:
EDIT: еще одна мысль пришла мне в голову. Просто для записи, попробуйте отключить кэш просмотра списка:
у меня была такая же проблема с использованием ListAdapter
Я позволил Android Studio реализовать методы для меня, и это то, что я получил:
проблема в том, что эти методы не называть super реализаций так notifyDataSetChange никогда не вызывается.
удалить эти переопределения вручную или добавить супер звонки и он должен работать снова.
если adapter установлено значение AutoCompleteTextView затем notifyDataSetChanged() не работает.
Источник
Android ListView не обновляется после notifyDataSetChanged
Мой код ListFragment
Но это не обновляет ListView . Даже после перезапуска приложения обновленные элементы не отображаются. Мой ItemAdapter простирается BaseAdapter
Кто-нибудь может помочь?
Посмотрите на свой onResume метод в ItemFragment :
то, что вы только что обновили перед вызовом, notifyDataSetChanged() является не полем адаптера, private List items; а идентично объявленным полем фрагмента. Адаптер по-прежнему хранит ссылку на список элементов, которые вы передали при создании адаптера (например, во фрагменте onCreate). Самый короткий (в смысле количества изменений), но не элегантный способ заставить ваш код вести себя так, как вы ожидаете, — это просто заменить строку:
Более элегантное решение:
1) удалить элементы private List items; из ItemFragment — нам нужно сохранить ссылку на них только в адаптере
2) измените onCreate на:
3) добавить метод в ItemAdapter:
4) измените свой onResume на:
Вы назначаете перезагруженные элементы глобальным переменным items onResume() , но это не отразится на ItemAdapter классе, потому что у него есть собственная переменная экземпляра с именем «items».
Для обновления ListView добавьте в ItemAdapter класс refresh (), который принимает данные списка, т.е. элементы
обновить onResume() с помощью следующего кода
В onResume () измените эту строку
Проблема в том, что вы никогда не сообщаете своему адаптеру список новых элементов. Если вы не хотите передавать новый список вашему адаптеру (а кажется, что это не так), просто используйте items.addAll после вашего clear() . Это гарантирует, что вы изменяете тот же список, на который ссылается адаптер.
Если адаптер уже настроен, повторная установка не приведет к обновлению списка. Вместо этого сначала проверьте, есть ли у listview адаптер, а затем вызовите соответствующий метод.
Я думаю, что создавать новый экземпляр адаптера при настройке представления списка — не очень хорошая идея. Вместо этого создайте объект.
Также вы можете попробовать запустить список обновления в потоке пользовательского интерфейса:
Если вы хотите обновить ваш ListView не имеет значения , если вы хотите сделать это на onResume() , onCreate() или в какой — либо другой функции, первая вещь , которую вы должны понять, что вам не нужно будет создать новый экземпляр адаптера, просто Заселите снова массивы с вашими данными. Идея примерно такая:
Поэтому в зависимости от этого ответа вы должны использовать то же самое List в своем Fragment . При первой инициализации адаптера вы заполняете список элементами и устанавливаете адаптер для просмотра списка. После этого при каждом изменении в ваших элементах вы должны очищать значения из основного, List items а затем снова заполнять его своими новыми элементами и вызывать notifySetDataChanged(); .
Источник
NotifyDataSetChanged () не обновляющий адаптер
Список адаптеров обновляется на широковещательном приемнике.
Все работает нормально, если размер списка адаптеров больше 1, означает, что мой recyclerview уже имеет одну строку, а затем обновляет список. Но если размер списка идет от 0 до 1, то мой адаптер уведомляет набор данных. Нет данных о повторном просмотре. Я не знаю, почему он не работает.
Класс Recyclerview:
Класс адаптера:
Пожалуйста, помогите мне найти ошибку или какой-нибудь другой подход. благодаря
Вызовите задачу загрузки данных внутри onReceive() BroadcastReceiver
А также выполните следующие изменения в классе адаптера .
Надеюсь, что это работает!
Измените это:
На вашем адаптере
Вы не должны вызывать notifyDataSetChanged () после this.notifyItemRangeInserted(0, candidates.size() — 1); Попробуйте что-то вроде этого:
Поместите этот метод в класс адаптера
И назовите его так:
Исправьте этот метод в своем адаптере
Основываясь на вашем коде, нам нужен список переменных для хранения ваших информационных данных.
В вашем onCreateView() установите mInfos в recycleAdapter
Поэтому каждый раз, когда вы хотите установить новый информационный список. Просто назначьте его mInfos и убедитесь, что вы mInfos предыдущие данные списка, чтобы избежать дублирования данных.
Я не уверен, где вы используете clearApplications () в JobAdapter.class. Но, похоже, это неправильно. В for-loop вы пытаетесь удалить значение в индексе 0 каждый раз, а не индекс «i». Надеюсь это поможет.
Когда вы используете пользовательский адаптер, notifyDatasetChange () не вызывается извне этого адаптера, поэтому добавьте функцию addItem в адаптер и добавьте новый список в списке адаптеров и вызовите notifyDataSetChanged
Источник
Русские Блоги
Android Adapter.notifyDataSetChanged () изменяет данные, но не обновляет
Я обнаружил феномен, когда делал домашнюю работу по Android сегодня:
Порылся некоторое время и нашел причину:
Просмотрите конструктор SongAdapter:
Обычный способ написания Adapter — использовать переменную-член mData для хранения ссылки на данные, а затем обновление ListView обновляется с помощью таких методов, как Adapter.getItem (), и данные, к которым получают доступ эти методы, — это данные, на которые указывает эта mData. Если эти данные не изменятся, notifyDataSetChanged не будет обновляться.
В случаях 1 и 3 локальная переменная mSongVO и переменная-член mData SongAdapter указывают на один и тот же адрес памяти, а именно на данные A, поэтому после того, как mSongVO изменили A, notifyDataSetChanged обнаружил, что данные изменились при доступе к A через mData, поэтому они были обновлены Посмотреть список.
В случае 2 локальная переменная mSongVOs получает новые данные B через getSong (B). На самом деле, mSongVOs указывает на другой адрес B в памяти, и в это время mData по-прежнему указывает на A. Поэтому notifyDataSetChanged отмечает, что A не изменился, поэтому он не обновляется.
Следовательно, в случае 2 адаптер не «данные изменяются, но не обновляются», а «данные не изменяются вообще».
Интернет говорит, что повторная привязка адаптера может быть обновлена. Фактически, переменная-член mData повторно привязана, поэтому ее можно обновить.
Бизнес-логика в случаях 2 и 3 заключается в изменении целого пакета данных. Случай 2 представляется очень интуитивным и разумным в программировании, но вы должны обратить на это внимание, вам придется использовать третий способ записи.
Еще раз о важности анализа памяти!
Интеллектуальная рекомендация
Многослойная презентацияViewController Jap
. Недавно, проект использует многоэтажные прыжки [A presentViewController: B animated: YES] [B presentViewController: C animated: YES] . Проблема в том, где: как это идет прямо к? Я не нашел ме.
Распечатать список с конца до головы
В случае, когда таблица цепи не может изменять дисплей, данные хранения стека могут рассматриваться с рекурсивным методом. Разрешить модификацию структуры ссылки.
Типы данных и переменные
тип данных Компьютерная программа может обрабатывать различные значения. Однако компьютеры могут обрабатывать гораздо больше, чем числовые значения. Они также могут обрабатывать различные данные, таки.
Python Daily Practice (4) -идиомы заполняют музыку
оглавление 1. Одно место 2. Случайное расположение 3. Добавьте баллы для оценки 4. Получение файла 5. Установите уровень сложности. 6. Срок завершения 7. Выберите заполнение пропусков. 1. Одно место Н.
Источник
Лучший способ обновить адаптер / ListView на Android
Моя книга «Hello Android» дает это как способ использования пользовательского помощника db, настройки курсора, а затем настройки адаптера следующим образом:
С этим, однако, каждый раз, когда мне нужно обновить набор данных, мне нужно продолжать работать с этим блоком кода (который немного затрудняет внутри onClick () для кнопки из-за того, что «это» недоступно.
Это лучший способ обновить набор данных, или я должен посмотреть на удаление .close и выдачу адаптера.notifyDataSetChanged ()? Если я это сделаю, иногда я получаю силу как (и я не могу вспомнить на данный момент), но иногда она не может правильно удалить. Я думаю, это может быть из-за того, что база данных в настоящее время открыта, и она пытается открыть ее снова.
Должны ли мы также объявлять переменные для курсоров, DatabaseHelpers и Adapter в классе (вне OnCreate), чтобы они были доступны для всех функций?
Я понимаю, что это просто плохое программирование на данном этапе, но я пытаюсь понять, как лучше всего это делать.
Вы должны использовать adapter.notifyDataSetChanged() . Что говорит журнал, когда вы используете это?
Просто добавьте этот код перед установкой Adapter он работает для меня:
Или напрямую вы можете использовать метод ниже после изменения ресурса данных.
Следующий код отлично подходит для меня
Лучший способ обновить адаптер / ListView на Android
Не только вызов notifyDataSetChanged () обновит данные ListView, перед тем, как правильно загрузить информацию, необходимо вызвать setAdapter() :
Если вы используете LoaderManager, попробуйте с этим утверждением:
Возможно, их проблема – это момент, когда поиск выполняется в базе данных. В его циклах переопределения фрагментов его Fragment.java нужно просто выяснить: попробуйте провести тестирование с помощью методов:
Попробуйте аналогично поставить Log.i … «onStart» и «onResume».
Наконец, отредактируйте код в «onCreate» и поместите его в «onStart», например:
Просто напишите в своем Custom ArrayAdaper этот код:
Просто напишите в своем Custom ArrayAdaper этот код:
Источник