最近在开发android一个项目的时候,发现有时候notifyDataSetChanged不起作用。后来发现是我理解错了。
一个典型的错误是:
list1 = new String[]{"listView1 item"}; ap1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list1); listView1.setAdapter(ap1); list1 = new String[]{"new listView1 item"}; ap1.notifyDataSetChanged();
我一直以为ap1会监听list1的变化,重新初始化list1,然后执行相应的更新,现在才知道不对,ap1监听的是new String[]{"listView1 item"}的变化。
换种说法就是ap1本身会保存一个对原始数据源(new String[]{"listView1 item"})的内部引用inner_list1。
list1 = new String[]{"new listView1 item"};相当与切断了list1与原始数据源(new String[]{"listView1 item"})的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list1 和inner_list1已经是存在于堆上的完全不同的两个对象了,自然而然,notifyDataSetChanged是不会生效的了,仅此牢记!
listView.removeAllViews();
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();