notifyDataSetChanged()不适用于自定义适配器

时间:2014-02-06 07:27:30

标签: android android-listview android-adapter

我已经经历了许多类似的问题,但我仍然没有得到答案。

我正在使用具有arraylist for 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反映了预期的变化。所以我想知道这背后的原因是什么。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

在自定义适配器中运行中实现更改信息的一种方法是为该方法添加一个方法(在确保您在UI线程之后),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();
     }
  });
}