notifyDataSetChanged пример



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



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



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

546   5  

5 ответов:

на 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-потоке, используйте 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

    Ничего не найдено.