пример notifyDataSetChanged - PullRequest
       50

пример notifyDataSetChanged

157 голосов
/ 08 сентября 2010

Я пытаюсь использовать в моем Android Application notifyDataSetChanged() метод для ArrayAdapter, но он не работает для меня.

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

Может кто-нибудь прислать пример или хотя бы ссылку?!

Ответы [ 5 ]

317 голосов
/ 23 февраля 2011

Для ArrayAdapter, notifyDataSetChanged работает, только если вы используете add(), insert(), remove() и clear() на адаптере.

Когда создается ArrayAdapter, он содержит ссылку на переданный List. Если вы должны были передать List, который был членом действия, и изменить это действиепозже, ArrayAdapter все еще содержит ссылку на оригинал List.Адаптер не знает, что вы изменили List в действии.

На ваш выбор:

  1. Используйте функции ArrayAdapter для изменения базового списка (add(), insert(), remove(), clear() и т. Д.)
  2. Повторно создайте ArrayAdapter с новыми данными List.(Использует много ресурсов и сборщик мусора.)
  3. Создайте свой собственный класс, полученный из BaseAdapter и ListAdapter, который позволяет изменять базовую структуру данных List.
  4. ИспользоватьnotifyDataSetChanged() каждый раз, когда список обновляется.Чтобы вызвать его в UI-Thread, используйте runOnUiThread() из Activity.Тогда notifyDataSetChanged() будет работать.
30 голосов
/ 08 сентября 2010

Вы можете использовать метод runOnUiThread() следующим образом.Если вы не используете ListActivity, просто измените код, чтобы получить ссылку на ваш ArrayAdapter.

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
11 голосов
/ 15 февраля 2013

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

Пожалуйстаследуйте Как правильно реализовать BaseAdapter.notifyDataSetChanged () в Android или в новом блоге BaseAdapter.notifyDataSetChanged () .

6 голосов
/ 14 декабря 2011

У меня была та же проблема, и я предпочитаю не заменять весь 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);
        }
    }
}
2 голосов
/ 18 сентября 2014

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

Итак, моя ситуация была следующей.

Мне пришлось обновить представление списка на вкладке панели действий (фрагмент) с содержимым, возвращенным из совершенно другого действия. Первоначально, однако, просмотр списка не отражал бы никаких изменений. Однако, когда я щелкнул другую вкладку, а затем вернулся на нужную вкладку, представление списка было бы обновлено с правильным содержанием из другого действия. Поэтому, чтобы решить эту проблему, я использовал 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 и будет напрямую обновлять мой список в FragmentTab2.

Надеюсь, кто-нибудь найдет это полезным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...