对于listview的优化有以下三个措施:
1、原有listview每一个item显示时都会调用一次getView()方法,实际上对于ListView而言,只需要保留能够显示的最大个数的view即可,其他新的view可以通过复用的方式使用消失的条目的view,而getView方法里也提供了一个参数:convertView,这个就代表着可以复用的view对象,当然这个对象也可能为空,当它为空的时候,表示该条目view第一次创建。
@Override public View getView(int position, View convertView, ViewGroup parent) { View view; // 判断convertView的状态,来达到复用效果 if (null == convertView) { //如果convertView为空,则表示第一次显示该条目,需要创建一个view view = View.inflate(MainActivity.this, R.layout.listview_item, null); } else { //否则表示可以复用convertView view = convertView; } // listview_item里只有一个textview TextView tv_item = (TextView) view.findViewById(R.id.tv_item); tv_item.setText(list.get(position)); return view; }
2、上面是对view对象的复用做的优化,我们经过上面的优化之后,我们不需要每一个view都重新生成了。下面我们来解决下一个每一次都需要做的工作,那就是view中组件的查找。
基本思路就是在convertView为null的时候,我们不仅重新inflate出来一个view,并且还需要进行findviewbyId的查找工作,但是同时我们还需要获取一个ViewHolder类的对象,并将findviewById的结果赋值给ViewHolder中对应的成员变量。最后将holder对象与该view对象“绑”在一块。
当convertView不为null时,我们让view=converView,同时取出这个view对应的holder对象,就获得了这个view对象中的TextView组件,它就是holder中的成员变量,这样在复用的时候,我们就不需要再去findViewById了,只需要在最开始的时候进行数次查找工作就可以了。这里的关键在于如何将view与holder对象进行绑定,那么就需要用到两个方法:setTag和getTag方法了:
@Override public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder; // 判断convertView的状态,来达到复用效果 if (null == convertView) { // 如果convertView为空,则表示第一次显示该条目,需要创建一个view view = View.inflate(MainActivity.this, R.layout.listview_item, null); //新建一个viewholder对象 holder = new ViewHolder(); //将findviewbyID的结果赋值给holder对应的成员变量 holder.tvHolder = (TextView) view.findViewById(R.id.tv_item); // 将holder与view进行绑定 view.setTag(holder); } else { // 否则表示可以复用convertView view = convertView; holder = (ViewHolder) view.getTag(); } // 直接操作holder中的成员变量即可,不需要每次都findViewById holder.tvHolder.setText(list.get(position)); return view; }
3、数据库分页查找,listview分批显示。