2014-02-06 4 views
0

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

Я использую пользовательский адаптер, имеющий ArrayList для ListView, когда есть какие-то изменения на панель поиска ArrayList модифицируются, и я хочу показать это меняет на ListView, я Доиг это следующие два способов

lv = (ListView) findViewById(R.id.lv_showcontactlist); 
    customAdapter = new ContactListViewAdapter(this); 
    customAdapter.setList(contactList); 
    lv.setAdapter(customAdapter); 
    contactList_temp = new ArrayList<ContactBean>(contactList); 

попытку 1)

public void onProgressChanged(SeekBar seekBar, int progress, 
     boolean fromUser) { 
    for (ContactBean object : contactList_temp) { 
     int sal = Integer.parseInt(object.getSalary()); 
     if (sal > progress) { 
      contactList.remove(object); 
     } 

    } 

    customAdapter.notifyDataSetChanged(); 
    contactList.clear(); 
    contactList.addAll(contactList_temp); 
} 

попытка 2)

public void onProgressChanged(SeekBar seekBar, int progress, 
     boolean fromUser) { 
    contactList.clear(); 

    for (ContactBean object : contactList_temp) { 
     int sal = Integer.parseInt(object.getSalary()); 
     if (sal < progress) { 
      contactList.add(object); 
         } 
    } 
    customAdapter.notifyDataSetChanged(); 
    contactList.addAll(contactList_temp); 
} 

Setlist метод в моем классе адаптера:

public void setList(ArrayList<ContactBean> newList) { 
    this.m_contactlist = newList; 
    } 

Моя проблема заключается в оба метода логически делают ту же задачу, но мой 1 метод не ListView остается тем же, но второй метод работает должным образом ListView отражает изменения, как и ожидалось. Поэтому я хочу знать, в чем причина этого.

ответ

3

Перед изменением данных адаптера вы вызываете customAdapter.notifyDataSetChanged(). Вы должны вызвать этот метод после изменения данных адаптера.

Смотрите ниже для редактирования

В попытке 1: -

Код должен быть

// customAdapter.notifyDataSetChanged(); // NOT HERE 
contactList.clear(); 
contactList.addAll(contactList_temp); 
customAdapter.notifyDataSetChanged(); // MUST BE HERE 

В попытке 2

Код должен быть

// customAdapter.notifyDataSetChanged(); // NOT HERE 
contactList.addAll(contactList_temp); 
customAdapter.notifyDataSetChanged(); // MUST BE HERE 
+0

no. Я хочу показать измененное содержимое контакт-листа в текстовом виде и для дальнейшей работы. Я переназначаю контактный список с его резервной копией contactlist_temp, я не хочу показывать содержимое contactlist_temp. – DCoder

+0

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

2

Один из способов реализации изменяющейся информации в середине запуска в пользовательском адаптере - это добавить метод для этого и в этот метод (после обеспечения того, что вы находитесь в потоке пользовательского интерфейса), notifyDatasetChage.

public void setList(List<T> data) { 
    this.mData = data; 
    Handler handler = new Handler(Looper.getMainLooper()); 
    handler.post(new Runnable() { 
    @Override 
    public void run() { 
     notifyDatasetChanged(); 
    } 
    }); 
} 
+0

Обратите внимание, что если вы поместите это в адаптер, это очень вероятно 'notifyDatasetChanged();' приведет к ошибке, потому что в этом месте не упоминается контекст адаптера. – fasteque

Смежные вопросы