Я пытаюсь использовать в моем Android Application
к notifyDataSetChanged()
для метода , ArrayAdapter
но он не работает для меня.
В качестве ответа я нашел , что это notifyDataSetChanged()
должно выполняться в главном потоке, но не было никакого примера для этого.
Кто-нибудь может прислать пример или хотя бы ссылку ?!
Ответы:
Для того
ArrayAdapter
,notifyDataSetChanged
работает только если вы используетеadd()
,insert()
,remove()
, иclear()
на адаптере.Когда
ArrayAdapter
конструируется, он содержит ссылку для того,List
что было передано. Если вы должны были передать элемент,List
который был членом действия, и позже изменить этот член действия,ArrayAdapter
он все еще содержит ссылку на оригиналList
. Адаптер не знает, что вы изменилиList
действие.Ваш выбор:
ArrayAdapter
изменить основной список (add()
,insert()
,remove()
,clear()
и т.д.)ArrayAdapter
заново с новымиList
данными. (Использует много ресурсов и сборку мусора.)BaseAdapter
иListAdapter
позволяющий изменять базовуюList
структуру данных.notifyDataSetChanged()
каждый раз, когда список обновляется. Чтобы вызвать его в UI-Thread, используйтеrunOnUiThread()
ofActivity
. ТогдаnotifyDataSetChanged()
будет работать.источник
notifyDataSetChanged()
таким образом((BaseAdapter) arrayAdapter).notifyDataSetChanged();
?Вы можете использовать
runOnUiThread()
метод следующим образом. Если вы не используетеListActivity
, просто адаптируйте код, чтобы получить ссылку на вашArrayAdapter
.источник
Я недавно писал на эту тему, хотя этот пост уже старый, я подумал, что он будет полезен для тех, кто хочет знать, как реализовать
BaseAdapter.notifyDataSetChanged()
шаг за шагом и правильным способом.Пожалуйста, следуйте инструкциям Как правильно реализовать BaseAdapter.notifyDataSetChanged () в Android или в новом блоге BaseAdapter.notifyDataSetChanged () .
источник
mItem.add()
я только что отредактировал один элемент, значит,mItem.get(position).setImage(encodedImage)
возможно, именно поэтому он выдает ошибку NullPointer exeption. Так что notifyDataSetChange работает только над его редактированием, bcz для адаптера Array, о котором упоминалось выше, это работает только для add (), clear (), remove () и т. д.У меня была та же проблема, и я предпочитаю не заменять весь ArrayAdapter новым экземпляром постоянно. Таким образом, у меня есть AdapterHelper, который выполняет тяжелую работу в другом месте.
Добавьте это, где вы обычно (пытаетесь) позвонить уведомить
Класс AdapterHelper
источник
super.addAll(..)
API> 11 и super.add (..). ) в сочетании с итерацией , как ваши:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
. Теперь просто расширяйте свой класс адаптеров.Я знаю, что это поздний ответ, но я столкнулся с аналогичной проблемой, и мне удалось решить ее, используя
notifyDataSetChanged()
в нужном месте.Так что моя ситуация была следующей.
Мне пришлось обновить представление списка на вкладке панели действий (фрагмент), чтобы содержимое возвращалось из совершенно другого действия. Первоначально, однако, просмотр списка не отражал бы никаких изменений. Однако, когда я щелкнул другую вкладку и затем вернулся на нужную вкладку, представление списка было бы обновлено с правильным содержанием из другого действия. Поэтому, чтобы решить эту проблему, я использовал
notifyDataSetChanged()
адаптер панели действий в коде действия, которое должно было возвращать данные.Это фрагмент кода, который я использовал в упражнении.
Это действие вернет некоторые данные
FragmentTab2
и напрямую обновит мой списокFragmentTab2
.Надеюсь, кто-то найдет это полезным!
источник