关于ListView的Adapter,解决ListView滚动后内容重复的问题
来源:互联网 发布:淘宝店的食品生产编号 编辑:程序博客网 时间:2024/06/11 21:09
摘要 这些天用到了ListView ,由于要用到 ImageView ,且图片源不是在资源里面的,也就没法用到 ID 了,也就不能用 SimpleAdapter 之类的了。只能自己改写一个 Adapter ,直接继承 BaseAdapter 。由于一开始只是在网上看了一下如何写 getView 这个方法,根本没有
这些天用到了ListView,由于要用到ImageView,且图片源不是在资源里面的,也就没法用到ID了,也就不能用SimpleAdapter之类的了。只能自己改写一个Adapter,直接继承BaseAdapter。由于一开始只是在网上看了一下如何写getView这个方法,根本没有去进一步理解各个参数的含义(当然现在也没有全理解。。。),一样一来,运行没问题了,ListView里面数据也有了,结果来了个Bug,滚动的时候有些地方会重复前面出现过的图片(或者说是第一页出现去的图片)。
正常情况下的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失效问题
- rtmpdump传输直播流 -- pause and resume
- Failed to create the java Virtual Machine
- Java线程简单实现方法
- 【内存对齐之主文】C/C++字节对齐详解
- 使用AlarmManager+Service+Thread来实现我们的轮询服务
- 关于ListView的Adapter,解决ListView滚动后内容重复的问题
- tomcat启动catalina.bat设置编码
- virtualbox 安装增强功能 加载光驱失败
- Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件
- 不同人生阶段不同的个人理财方式
- Android MediaPlayer的生命周期
- PonyDebugger - 远程网络数据调试工具
- Windows Socket五种I/O模型
- MySQL ('root'@'%') does not exist的问题