ListView性能优化:
1)在adapter中利用参数convertView复用组件:
有三种情况:一、单一组件复用比较简单,只需要判断传进来的convertView是否为空即可;二、带有固定标题的分级ListView的复用,针对不同的级别设置不同ViewHolder,类似于情况一;三、同一个Item可能会有不同布局类型,需要convertView在传递ViewHolder标签的同时,同时传递一个代表不同布局类型的标签
convertView.setTag(R.id.item_type, viewType)//布局类型标签
convertView.setTag(R.id.tag_key_chat_item_view,rightViewHolder);//ViewHolder标签
2)分页加载
最近在开发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是不会生效的了!