初学Android,发现有时候notifyDataSetChanged不起作用。后来发现是我理解错了。
一个典型的错误是:
1 | list1 = new String[]{"listView1 item"}; |
我一直以为ap1会监听list1的变化,重新初始化list1,然后执行相应的更新,现在才知道不对,ap1监听的是new String[]{“listView1 item”}的变化。
换种说法就是ap1本身会保存一个对原始数据源(new String[]{“listView1 item”})的内部引用inner_list1。
1 | list1 = new String[]{"new listView1 item"}; |
相当与切断了list1与原始数据源(new String[]{“listView1 item”})的关系,因此之后调用notifyDataSetChanged并不会起作用,因为list1 和inner_list1已经是存在于堆上的完全不同的两个对象了
错误回顾:
前段时间都是使用的Arrayist等等作为原始数据源,一般都是进行add之类的操作,所以list1 和inner_list1和一直都是保持对同以个变量的引用,
并没有出什么问题,当然,改为直接赋值还是会出问题。
看了一下Arrayadapter的源码:
ArrayAdapter:
1 | public ArrayAdapter(Context context, int textViewResourceId, T[] objects) { |
Arrays:
1 | public static <T> List<T> asList(T... array) { |
所以上面的问题可以归结为这么个问题:
1 | String[] a = new String[] {"hello","world"}; |