ListView数据重复现象,以及解决办法
来源:互联网 发布:淘宝店刷销量方法 编辑:程序博客网 时间:2024/05/22 08:16
转自:http://www.cnblogs.com/3dant/archive/2011/04/06/2007060.html
这些天用到了ListView,由于要用到自定义布局,也就不能用SimpleAdapter之类的了。只能自己改写一个Adapter,直接继承BaseAdapter。使用过程中出现了一个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");}
这样问题就很好的解决了。
作者:holmes Zhang
- ListView数据重复现象,以及解决办法
- LPC17XX串口接收数据死机现象解决办法
- ListView和GridView多次调用GetView的现象和解决办法
- ListView和GridView多次调用GetView的现象和解决办法
- android listview 解决数据重复
- 解决listView数据重复加载
- 解决ListView数据重复问题
- 安卓listview照片重复显示解决办法
- 服务器被攻击的四种现象以及解决办法!
- 几个ListView标记重复数据的方法
- ListView数据显示重复和性能问题
- ListView 滑动时数据重复错位解决
- Android listview下拉刷新,出现重复数据
- android listview 数据加载错乱、错位、重复
- oracle 查询重复数据以及删除重复数据
- 实时请求获取数据重复显示解决办法
- android ListView getView方法重复执行的解决办法
- ios开发中init()方法重复执行,以及实例变量错乱的灵异现象
- Android keystore 密码找回
- 自己写的shall函数集合
- 软件开发中的经验教训
- Android中spinner的简单用法(1)
- 混淆器ProGuard
- ListView数据重复现象,以及解决办法
- Leetcode81: Search Insert Position
- iOS中的堆和栈
- ionic项目中使用cordova插件支付宝支付
- HDU 5476 Explore Track of Point (2015年上海赛区网络赛I题)
- jquery.ajax 的例子
- 编译生成.NET DLL并调用
- android学习:在ListView显示对象信息、侦听列表事件
- ListCtrl虚拟列表---加载大数据