notifyDataSetChanged пример
Я пытаюсь использовать в своей Android Application the notifyDataSetChanged() метод ArrayAdapter но это не работает для меня.
Я нашел как ответить здесь, что notifyDataSetChanged() должен работать в основном потоке, но для этого не было примера.
кто-нибудь может прислать пример или хотя бы ссылку?!
5 ответов:
на
ArrayAdapter,notifyDataSetChangedработает только если вы используетеadd(),insert(),remove()иclear()на адаптере.когда
ArrayAdapterпостроен, он содержит ссылку наListэто было передано. Если вы должны были пройти вListэто был член действия, и изменить этот член действия позже,ArrayAdapterвсе еще держит ссылку на оригиналList. Адаптер не знает, что вы изменилиListв Деятельность.ваш выбор:
- использование функции
ArrayAdapterдля изменения списка (add(),insert(),remove(),clear()и т. д.)- воссоздать
ArrayAdapterноваяListданные. (Использует много ресурсов и сбор мусора.)- создать свой собственный класс, производный от
BaseAdapterиListAdapterчто позволяет изменять базовыйListструктуры данных.- использовать
notifyDataSetChanged()каждый раз список обновляется. Чтобы вызвать его в UI-потоке, используйтеrunOnUiThread()наActivity. Тогда,notifyDataSetChanged()будет работать.
можно использовать
runOnUiThread()метод следующим образом. Если вы не используетеListActivity, просто адаптируйте код, чтобы получить ссылку на вашArrayAdapter.final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter()); runOnUiThread(new Runnable() { public void run() { adapter.notifyDataSetChanged(); } });
Я недавно писал на эту тему, хотя этот пост он старый, я думал, что это будет полезно для тех, кто хочет знать, как реализовать
BaseAdapter.notifyDataSetChanged()шаг за шагом, и правильно.пожалуйста Как правильно реализовать BaseAdapter.notifyDataSetChanged() в Android или новый блог BaseAdapter.notifyDataSetChanged().
у меня была та же проблема, и я предпочитаю не заменять весь ArrayAdapter на новый экземпляр непрерывно. Таким образом, у меня есть AdapterHelper, который делает тяжелую работу где-то еще.
добавить это, где вы обычно (попробуйте) позвонить уведомить
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList)); adapter.notifyDataSetChanged();класс AdapterHelper
public class AdapterHelper { @SuppressWarnings({ "rawtypes", "unchecked" }) public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){ arrayAdapter.clear(); for (Object object : listOfObject){ arrayAdapter.add(object); } } }
Я знаю, что это поздний ответ, но я столкнулся с аналогичной проблемой, и мне удалось решить ее с помощью
notifyDataSetChanged()в нужном месте.Итак, моя ситуация была следующей.
мне пришлось обновить listview на вкладке панели действий (фрагмент) с содержимым, возвращенным из совершенно другой деятельности. Первоначально, однако, listview не будет отражать никаких изменений. Однако, когда я щелкнул другую вкладку, а затем вернулся на нужную вкладку, listview будет обновлен с помощью правильное содержание из другой деятельности. Поэтому для решения этой проблемы я использовал
notifyDataSetChanged()адаптера панели действий в коде действия, которое должно было вернуть данные.Это фрагмент кода, который я использовал в работе.
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_new_forward: FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab Intent ina = new Intent(getApplicationContext(), MainActivity.class); ina.putExtra("stra", values1); startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment). } }это действие вернет некоторые данные в
FragmentTab2и это будет непосредственно обновить мой listview вFragmentTab2.надеюсь, кто-то найдет это полезным!
Comments