对于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分批显示。