在网上看到一种普遍优化就是在getView那里自定义一个ViewHolder具体代码如下:
  public View getView(int position, View convertView, ViewGroup parent) {                           ViewHolder holder = null;             if (convertView == null) {                                   holder=new ViewHolder();                                     convertView = mInflater.inflate(R.layout.vlist2, null);                 holder.img = (ImageView)convertView.findViewById(R.id.img);                 holder.title = (TextView)convertView.findViewById(R.id.title);                 holder.info = (TextView)convertView.findViewById(R.id.info);                 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);                 convertView.setTag(holder);                               }else {                                   holder = (ViewHolder)convertView.getTag();             }                                         holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));             holder.title.setText((String)mData.get(position).get("title"));             holder.info.setText((String)mData.get(position).get("info"));                           holder.viewBtn.setOnClickListener(new View.OnClickListener() {                                   @Override                public void onClick(View v) {                     showInfo();                                  }             }); 
但是我发现打印那个convertView出来的话,每次都是null的,也就是说每次都会是null,那优化何在呢?求解

解决方案 »

  1.   

    = =代码怎么会这样,我简单的描述,就是在getView里面维护一个Viewholder,然后把listview复制给convertView。。但是每次getview的时候打印出来的convertView都是null的,也就是说getview里面根本没优化。
      

  2.   

    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder; if (convertView == null) {
    System.out.println("convertView "+convertView);
    convertView = inflater.inflate(R.layout.music_item, null);
    holder = new ViewHolder();
    holder.tv_music_name = (TextView) convertView
    .findViewById(R.id.tv_music_name);
    convertView.setTag(holder);
    } else {
    holder = (ViewHolder) convertView.getTag();
    }
    holder.tv_music_name.setText(map.get(position));
    return convertView;
    }
      

  3.   

    convertview并不总是为null的,可以参考sdk文档里的说法,用viewholder效率会有很大提高,也可以看一下照片文章http://zhiweiofli.iteye.com/blog/1269746
      

  4.   

    假如你调用Adapter的notifyDataSetChanged方法试试看
      

  5.   

    我在设置adapter之后调用了,还是打印出来的都是null= =莫非是在程序内部优化???
      

  6.   

    你的list有没有超过一页?没有就是这样的,,
      

  7.   

    listview的每一个item都会调用一次getView方法,用ViewHolder就是最大限度地减少生成list item里面的对象,不过,最少也要生成一页,滑动的时候,新显示的项就调用上面隐藏掉的项,如果你的listview不超过一页,肯定每一项开始都是null。。
      

  8.   

     介意楼主直接继承SimpleAdapter,重写 getView方法,至于ViewHolder 如何构建,让父类SimpleAdapterr 的父类BaseAdapter去处理,我们只要做的是super.getview()返回的View进行处理。
      希望我的回答对你有帮助
      

  9.   

    这里有两部分值得一提:
    1、holder的作用你应该可以看出来的。如果holder是static的话那么只实例化一次,如果多次调用的话那么起到了优化。
    2、convertView是adapter的缓存机制设计的。你可以了解一下内存优化就知道了。如果你不用convertview的话那么它是不会进行缓存的。convertView也不是每次都是null,只是在第一次显示的时候是null,通俗一点就是在屏幕中的不是null,没有在屏幕中first-1和last+1其实也是有缓存的。
    这是个人理解。推荐看看eoe中的一篇内存优化。
      

  10.   


    请问其中的inflater 是指什么东西啊?我新手,不懂哦
      

  11.   

     if (convertView == null)    改为viewHolder
      

  12.   

    看了你的代码,你这样输出到控制台的convertView永远为空
    if (convertView == null) {
                    System.out.println("convertView "+convertView);
    你这样写每次判断为空的时候才会输出,建议你吧输出语句放到最后