//这里 convertView 可能是空,也可以说一个已经存在的视图,但是比较要命的是,如果 convertView 是一个包含子控件的控件组,那么它自己虽然不是null,但是部分子控件可能是被销毁的,如果使用 convertView.findViewById(id)取回控件时,是可能是 null的。
这就导致了,这个判断毫无意义,因为不能保证子控件可用,那么整个控件组也是不可用的,毕竟动态的生成那些被null了的子控件是非常麻烦的,一般convertView 是从一个xml布局文件生成的,如果子控件要动态生成,完全不能使用这种方法了。

解决方案 »

  1.   

    convertView 为空就要绑定,不为空就直接付值,就不存在你说的子控件被销毁
      

  2.   

    如果convertView ,要重新new一个视图
      

  3.   


    供参考:
    我遇到的情况是这样的,ListView 里的子View 有多个不同的布局, 子View布局是由数据源决定的。
    比如有4个布局:
    Layout 1 是 2个button + 1个ImageView 
    Layout 2 是 1个button + 1个ImageView + 1 个TextView
    Layout 3 是 2个button + 1个TextView
    Layout 4 是 1个button + 2个ImageView
    每个子View都是这4个布局里的一个。因为 convertView  要复用,所以每个布局下的控件都不能销毁,这点和楼主的略有不同。
    所以采用的是设Tag的方式,get出来之后先判断是哪个布局,和目标布局相符就不动,
    不符合目标布局,就通过代码调整布局。这样从xml布局生成View的次数就固定了,也达到了convertView复用的功能,唯一的缺点就是要动态调整布局,比较麻烦。
      

  4.   

    TextView itemText;
        CheckBox itemCheck;
        ImageView itemImage;
        public boolean initItemView(View convertView){
            itemText = (TextView) convertView.findViewById(R.id.group_item_text);
            if(itemText==null) return false;
             FrameLayout fl = (FrameLayout) convertView.findViewById(R.id.group_item_frame);
             if(fl==null) return false;
            itemCheck = (CheckBox)fl.findViewById(R.id.group_item_check);
            if(itemCheck==null) return false;
            itemImage = (ImageView) fl.findViewById(R.id.group_item_image);
            if(itemImage==null) return false;
            return true;
        }
    @Override
        public View getView(int position, View convertView, ViewGroup parent) {  
            if(convertView==null||!initItemView(convertView)){
            com.Loge(""+(convertView==null));
            convertView = LayoutInflater.from(mContext).inflate(R.layout.group_grid_item, null);
            }
            initItemView(convertView);
            itemText.setText(sd.GroupList.get(position).Name);
             itemCheck.setId(position);
             itemCheck.setOnCheckedChangeListener(itemCheckChangedListener);
             itemCheck.setVisibility(showCheck);
            return convertView;  
        }输出大量的 false,也就是convert不为空,但是子控件取不出来。如果是新生成的 convertVew都会成功取回子控件。事实上,每次convertView不为空的时候,总是有子控件为空。所以,每次实际上都是新生成的。
      

  5.   

     if (convertView != null) {
                holder = (listViewHolder) convertView.getTag();
            } else {
                convertView = mInflater.inflate(R.layout.myblog_list, null);
                holder = new listViewHolder();
                holder.title=(TextView) convertView.findViewById(valueViewID[2]);
                holder.notemessage=(TextView) convertView.findViewById(valueViewID[0]);
                holder.notetime=(TextView) convertView.findViewById(valueViewID[1]);
                convertView.setTag(holder);
            }这样写吧
      

  6.   

    只有convertView 为空的情况下才去找ID,
      

  7.   

    接点分。class TAG_Layout {
            TextView itemText;
         CheckBox itemCheck;
         ImageView itemImage;
        }     public boolean initItemView(View convertView){
            itemText = (TextView) convertView.findViewById(R.id.group_item_text);
            if(itemText==null) return false;
             FrameLayout fl = (FrameLayout) convertView.findViewById(R.id.group_item_frame);
             if(fl==null) return false;
            itemCheck = (CheckBox)fl.findViewById(R.id.group_item_check);
            if(itemCheck==null) return false;
            itemImage = (ImageView) fl.findViewById(R.id.group_item_image);
            if(itemImage==null) return false;
            return true;
        }

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {  
    TAG_Layout tag;
            if(convertView == null){
            convertView = LayoutInflater.from(mContext).inflate(R.layout.group_grid_item, null);
    tag = new TAG_Layout();
    tag.itemText = convertView.findViewById(R.id.group_item_text);
    tag.itemCheck = convertView.findViewById(R.id.group_item_check);
    tag.itemImage = convertView.findViewById(R.id.group_item_image);
    convertView.setTag(tag);
    } else {
    tag = convertView.getTag();
    }
            
            tag.itemText.setText(sd.GroupList.get(position).Name);
             tag.itemCheck.setId(position);
             tag.itemCheck.setOnCheckedChangeListener(itemCheckChangedListener);
             tag.itemCheck.setVisibility(showCheck);

            return convertView;  
        }
      

  8.   

    OK,楼上两位的方法就是利用 setTag hold住一个对象,这个对象就不会被释放了,通过这个对象的成员设置成需要hold住的子控件,它们也不会被释放了。我去试一下。