关于ListView的Adapter,解决ListView滚动后内容重复的问题
来源:互联网 发布:淘宝什么时候自动评价 编辑:程序博客网 时间:2024/06/02 23:00
正常情况下的getView方法体
public View getView(int position, View convertView, ViewGroup parent){
}
里面比较纠结的就是View convertView。
converView就是ListView里面每条记录(Item)的样式布局。
在ListView里面每显示一条记录就会记录就会调用一次getView。但是为了优化速度,它只会缓存当前屏幕所显示的记录的View。这个可以在getView里面加一个输出语句,看getView什么时候执行,执行过多少次。就明白了。
private
LayoutInflater mInflater;
@Override
public
View getView(
int
position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder myViews;
if
(convertView ==
null
){
System.out.println(
"为空:"
+ position);
myViews =
new
ViewHolder ();
convertView = mInflater.inflate(R.layout.lst_item,
null
);
myViews.mNameText = (TextView) convertView.findViewById(R.id.clst);
myViews.mPhoto = (ImageView) convertView.findViewById(R.id.mphoto);
convertView.setTag(myViews);
}
else
{
myViews = (ViewHolder ) convertView.getTag();
System.out.println(
"不为空:"
+ position);
}
Info p = infoList.get(position);
String dn = p.getDisplayName;
If (!dn==
null
){
myViews.mNameText.setText(dn);
}
Bitmap bm = p.getPhoto();
If(!p ==
null
){
myViews.mPhoto.setImageBitmap(bm);
}
//myViews.mNameText.setText(dn);
//Bitmap bm = p.getPhoto();
//myViews.mPhoto.setImageBitmap(bm);
return
convertView;
}
static
class
ViewHolder {
private
TextView mNameText;
private
ImageView mPhoto;
}
回到问题上来:
出现重复内容,基本上都是使用了ViewHolder这种方法的。
当我们判断 convertView == null 的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置进去。
如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。
后面就是对ViewHolder里面那些控件来进行设置,比如显示文字,显示图片什么的了。
如果再接下来的设置中,有某些条记录的某些控件没有被赋值,比如TextView因为要设置的内容为空,或者ImageView因为图片为空就没有赋值,而是直接跳过了。就类似下面这种。
String t = XXX.getName;
Bitmap p = XXX.getPhoto;
If (!t ==
null
){
mViewHolder.nameText.setText(t);
}
If(!p ==
null
){
mViewHolder.photoView.setImageBitmap(p);
}
前面说过,ListView只会缓存第一屏里面的List Item的视图布局,之后滚动ListView后面的Item的布局就都是用前面所缓存的视图布局(也就是convertView不为null)。这样如果当后面的某一条记录里面的某些控件因上面的原因没有赋值,就会直接使用前面所缓存的视图里面的值了(里面有值的话)。
这样的最终效果就是,滚动的时候,会出现前面已经出现过的内容。
最简单的解决方法就是,在上面的代码中不去判断赋值内容是否为空,而是直接设定对应该控件的值,即使用事例代码中的注释部分。(去掉上面代码中的if段)
真正的解决方法,则规避不对ViewHolder中的元素进行赋值这种情况。拿上面的代码来说:
If (!t == null){ mViewHolder.nameText.setText(t);}
这个时候,在t == null 时,就没有对viewHolder进行赋值,所以在t == null时,界面上的元素就有可能是没有更新的,也就是重复上一个(这个位置视图)。所以可以加上一个else,并在里面对viewholder进行赋值。
If (!t == null){ mViewHolder.nameText.setText(t);}else{ mViewHolder.nameText.setText("unknow");}
这样问题就很好的解决了。
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- ListView滚动后内容重复的问题
- android listview 异步加载图片并防止错位及解决ListView滚动后内容重复的问题
- ListView滚动后内容重复的问题(Listview进度条,图片错乱的问题)
- ListView 显示柱状图,并解决滚动时内容重复的问题
- listview滚动后,内容重复问题,,图片错位
- listView的adapter问题
- 关于listview滚动不停getView()的问题~~已解决~
- reactnative 解决listview无法滚动的问题
- Android-关于一个界面同级中需要两个listView时,一个ListView被嵌套在ScrollView中,ListView的适配器adapter中的getView执行次数重复问题
- 安卓中常见ListView等加载Adapter后的错乱问题
- 解决scrollview嵌套listview后,listview的setSelection失效问题
- 【jiasuba】系统的那些经常被大家忽视的注册表常用键值的意思
- 生成release版本的Android系统
- Ubuntu12.04下FSL的安装(待完善)
- mysql索引列不能改为text属性
- xml文件的注意事项
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- 不要使用PeekChar()判断EOF
- 目标检测的图像特征提取之(一)HOG特征
- Flex通过IFrame调用JS函数
- log4net使用详解
- js - 字符串替换
- 展讯
- Perform,SendMessage,PostMessage
- 单独调用使用ueditor上传控件配置方法: