看网上的用例 大都是 static的    static class ViewHolder {
            TextView text;
            ImageView icon;
        }
必须是static 吗? 还是在这用static有特殊的作用?

解决方案 »

  1.   

    保证ViewHolder的对象唯一,节省内存~如果处理不当,在异步加载图片时很可能导致图片位置错乱~
      

  2.   


    哥们 可否说的详细点?  比如下面这例子?
    我看网上好多都是这么写的 还有怎么搞 头像就不会错乱了? 谢谢啊
      static class ViewHolder {
                TextView text;
                ImageView icon;
            }public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
    convertView = mInflater.inflate(R.layout.list_item_icon_text,
    parent, false);
    holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.text);
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);
    convertView.setTag(holder);
    } else {
    holder = (ViewHolder) convertView.getTag();
    }
    holder.text.setText(DATA[position]);
    holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
    return convertView;
    }
      

  3.   

    买本java书看看就好了,静态的自然比非静态的效率高
      

  4.   

     viewholder对象肯定不是唯一的
      

  5.   

    这个viewholder 模式的本意是减少findViewById的次数
      

  6.   

    静态类,系统只会为其分配一个内存空间,即使再用new关键字获得引用,也不会从新分配内存空间,所有引用都指向这个内存空间的地址,所以肯定是一个对象
      

  7.   


    静态内部类随父类本身存在,不依赖父对象
    而且Google官方文档的demo里就是这样写的,对象肯定不是唯一,私以为是为了提高效率,快速滑动的时候不会很难受
      

  8.   

    使用convertView缓存才是减少findViewById的次数,提高效率。
    使用静态,是保证holder = new ViewHolder();时不会重新分配内存空间,节省内存
      

  9.   


    holder = new ViewHolder();不会跑很多次,重新不重新分配必要性不大holder = (ViewHolder) convertView.getTag();多次执行的是这个,holder引用每次都会指向一块新的内存
      

  10.   


    说错了,指不指向新的内存由holder=后边的代码而定,跟楼主问的static没关系
      

  11.   


    我的理解是:
    ViewHolder holder = new ViewHolder()
    每次都是在stack中开辟一块内存保存 holder的地址  然后在heap中 分配ViewHolder的内存哥们的意思是
    ViewHolder 设置成static的 他就会保存到 stack中吗? 还是。。?
      

  12.   

    holder = new ViewHolder();的确不会跑多次,但也有可能只跑一次,当convertView == null成立时就会继续跑了,convertView是适配器提供的view缓存,是有过期时间的,当其过期就必须重新获取,这个时候holder = new ViewHolder();就会执行,而将ViewHolder声明为静态,就能保证holder = new ViewHolder();执行时就不会重新初始化这个对象,而是直接指向以前的对象,也不会再分配空间,即节省内存,又提高效率。
      

  13.   

    static关键字的作用就是保证该类在内存中只有一个对象,也就是只有一块内存空间,只是java方面的知识嘛,所以不会ViewHolder holder = new ViewHolder()一次就会开辟一块新地址的,而是不管new几次,都是指向第一次new时开辟的地址,所有引用共用这一地址,即节省内存、又提高效率。
    但是因为多个引用指向同一对象,一个引用操作的对象时,另一个引用也可能在操作,所以同时操作时就可能导致谁也得不到期望的结果,异步加载图片造成错位,几乎是因为这个原因
      

  14.   

    不使用静态ViewHolder,也不使用convertView缓存,保证每getView()一次都有一个ViewHolder对象,那么肯定不会出现错乱问题,不过这样就没效率了,所以不建议这样做。
    就以lz的代码为例吧,再getView时,设置文字的同时,同时将图片设置成默认图片(因为是多个引用共用一个对象,所以不设置的话,这张图片就会是上一次设置的图片),同时加载完成后,一定要找到图片正确的位置,如果位置不对,异步加载完成后就会出现在最新的一个图片控件上了,而其他位置可能就会是默认图片(还是多个引用指向一个对象的原因)。
      

  15.   

    那个对象肯定不是唯一的,哈哈,除非listview只有一条记录
      

  16.   

    - -||static关键字是java中的,保证类的内存地址唯一,也就是对象唯一,难道这个定义不是这样的?
    除非listview只有一条记录?这和对象唯一有什么关系呢,ViewHolder里面放的是控件,控件之上才是放list数据,正因为list中每个item的控件是一样的,才会使用这个static.就好像大箱子装小箱子,小箱子再装东西,大箱子永远只有一个,但不影响小箱子和东西到底有多少是不受大箱子影响的。
      

  17.   

    你要弄清楚这个static修饰的是类还是变量
      

  18.   

    呃,这个代码我写过的,图片错乱问题也遇到过,所以解决图片错乱问题的思路是不会错的,因为使用了适配器缓存convertView,并不是每次都会去new ViewHolder();所以,也有可能是多个引用共用一个对象的,如果缓存一直未过期,那么可能就只使用了一个ViewHolder对象(因为只调用了一次new ViewHolder();)。
        static关键字的确是我理解错误了,还说得这么肯定……对不住大家。
      

  19.   

    内部类尽量使用static,是java规范吧
    比如外部使用该内部类,可以避免实例化内部类所在的类,是这样不?