просмотр списка не обновляется с помощью вызова notifydatasetchanged () - PullRequest
14 голосов
/ 17 марта 2012

Это мой код

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 ничего не показывает. В чем проблема?

Ответы [ 4 ]

17 голосов
/ 17 марта 2012

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

// 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();

РЕДАКТИРОВАТЬ: Я понимаю, что вы хотите сделать сейчас, благодаря вашему комментарию. Возможно, вы захотите, чтобы адаптер заменил его содержимое на другие ваши 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();
5 голосов
/ 17 марта 2012

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

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

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

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

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

4 голосов
/ 17 марта 2012

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

3 голосов
/ 17 марта 2012

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

...