Listview не обновляется при вызове notifydatasetchanged()

Это мой код

listview =(ListView) findViewById(R.id.lv1);


    ArrayList<SClass> Monday = new ArrayList<SClass>();

    SClass s1=new SClass();
    s1.sName="samp";
    s1.salary=1000;
    Monday.add(s1);
    temp=Monday;
    adapter = new CustomAdap(this, temp);
    listview.setAdapter(adapter);

Приведенный выше код работает отлично. Но когда я меняю код на этот

    listview =(ListView) findViewById(R.id.lv1);


    adapter = new CustomAdap(this, temp);

    SClass s1=new SClass();
    s1.sName="samp";
    s1.salary=1000;
    Monday.add(s1);
    temp=Monday;

    listview.setAdapter(adapter);
    adapter.notifyDataSetChanged();

Listview ничего не показывает. В чем проблема?

Ответы

Ответ 1

Похоже, вы меняете коллекцию, с которой вы инициализировали адаптер. Я бы изменил ваш код таким образом:

// initial setup
listview =(ListView) findViewById(R.id.lv1);
ArrayList<SClass> Monday = new ArrayList<SClass>();
adapter = new CustomAdap(this, Monday);
listview.setAdapter(adapter);

// change your model Monday here, since it is what the adapter is observing
SClass s1=new SubjectClass();
s1.sName="samp";
s1.salary=1000;
Monday.add(s1);

// notify the list that the underlying model has changed
adapter.notifyDataSetChanged();

Обратите внимание, что если ваш CustomAdap был подклассом ArrayAdapter, вы также могли бы сделать

// change your array adapter here
SClass s1=new SubjectClass();
s1.sName="samp";
s1.salary=1000;
adapter.add(s1);

// notify the list that the underlying model has changed
adapter.notifyDataSetChanged();

EDIT: Я понимаю больше, что вы хотите сделать, благодаря вашему комментарию. Вероятно, вы захотите, чтобы адаптер заменил его содержимое тем, что тогда были разные ArrayLists. Я бы сделал ваш CustomAdap подклассом ArrayAdapter.

Тогда вы можете использовать его следующим образом:

// replace the array adapters contents with the ArrayList corresponding to the day
adapter.clear();
adapter.addAll(MONDAY);

// notify the list that the underlying model has changed
adapter.notifyDataSetChanged();

Ответ 2

Почему он работает в первом коде?

--- Поскольку вы устанавливаете значения в temp List и передаете его adapter, и он показывает его в listview.

Почему бы не работать во втором коде?

--- Поскольку вы устанавливаете temp для адаптера задолго до того, как вы установите значение в temp   во-вторых, ваш класс адаптера может не получить обновленное значение при установке нового значения temp.., потому что temp не является общедоступным или нет на уровне класса или не статичным. Поместите объявление temp на уровне root и попробуйте.

И, пожалуйста, покажите свой полный код столько, сколько требуется, и Logcat, если вы получаете предупреждения, кроме того.

Ответ 3

Проверьте ссылку на ваш ссылочный вид в соответствующем XML файле. Или, по крайней мере, проверьте наличие указанного XML файла.

Ответ 4

Какой адаптер вы используете? Очевидно, что ваш адаптер не обновляется после того, как вы установили данные в своей переменной temp.