//这里 convertView 可能是空,也可以说一个已经存在的视图,但是比较要命的是,如果 convertView 是一个包含子控件的控件组,那么它自己虽然不是null,但是部分子控件可能是被销毁的,如果使用 convertView.findViewById(id)取回控件时,是可能是 null的。
这就导致了,这个判断毫无意义,因为不能保证子控件可用,那么整个控件组也是不可用的,毕竟动态的生成那些被null了的子控件是非常麻烦的,一般convertView 是从一个xml布局文件生成的,如果子控件要动态生成,完全不能使用这种方法了。
这就导致了,这个判断毫无意义,因为不能保证子控件可用,那么整个控件组也是不可用的,毕竟动态的生成那些被null了的子控件是非常麻烦的,一般convertView 是从一个xml布局文件生成的,如果子控件要动态生成,完全不能使用这种方法了。
解决方案 »
- android平板电脑之间通过WiFi传递信息
- 如何用蓝牙socket同时传输文字和图片
- android频闪如何实现,需要和歌曲同步,做过的来。没做的可以讨论。
- android dex文件分析
- tabactivity 中怎么设置直接显示的选项卡的数量?
- 怎么从surfaceview切换到其他的view呢
- 安卓各控件的属性值
- 关于android程序自动更新功能<---------------新手问题{{{{{{{{{{{{{{{{{{{{{{{{{{{
- android 导入原完成的工程出错,求助~
- android PC和手机端通信问题
- 跪求类似小米的TimerPicker
- android适配不同分辨率的手机
供参考:
我遇到的情况是这样的,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复用的功能,唯一的缺点就是要动态调整布局,比较麻烦。
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不为空的时候,总是有子控件为空。所以,每次实际上都是新生成的。
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);
}这样写吧
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;
}