具体是什么问题,可以展开说说吗?我的理解上,异步下载图片,在下载完成前,持有的imageview所在item可能已被复用到另一个位置了,这时下载完成了再去设置此图片会造成错位。但我觉得UIL应该会去处理这种情况
解决方案 »
- 关于ViewPager的问题
- 如何用android实现临近提醒???
- 继承ArrayAdapter,重写getView时,convertView setTag与holder里addTextChangedListener同时存在出错
- Android launcher的图标移动实现原理
- 如何美化android软件界面
- TabHost中用BadgeView后无法切换
- 自定义TabHost中findViewById()方法无法获取到ID
- 初学者求搭救,关于viewPager和Intent
- android google map 与 listview 的问题
- 关于华为手机锁屏杀服务问题,怎么解决
- android里单元测试的问题
- 人人跳转参数问题
比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,第14行显示了第2行的View,这时之前的图片加载结束,就会显示在第14行,造成错乱。
http://stackoverflow.com/questions/14080117/universal-image-loader-wrong-bitmaps-are-attached-to-imageview
showStubImage 试试这个呢
ViewHolder holder = null;
if(convertView == null){
convertView = mInflater.inflate(R.layout.dish_item, null);
holder = new ViewHolder();
holder.mainPic = (ImageView) convertView.findViewById(R.id.main_pic);
holder.subPic1 = (ImageView) convertView.findViewById(R.id.sub_pic1);
holder.subPic2 = (ImageView) convertView.findViewById(R.id.sub_pic2);
holder.dishName = (TextView) convertView.findViewById(R.id.dish_name);
holder.dishComment = (TextView) convertView.findViewById(R.id.dish_comment);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
holder.dishComment.setText(String.format(getResources().getString(R.string.comment_count), mDishs.get(position).comments));
holder.dishName.setText(mDishs.get(position).name);
holder.mainPic.setImageResource(R.color.default_color);
holder.subPic1.setImageResource(R.color.default_color);
holder.subPic2.setImageResource(R.color.default_color); int len = mDishs.get(position).images.length;
if(len > 0){
holder.mainPic.setTag(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[0]);
displayImage(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[0], holder.mainPic, options);
}
if(len > 1) {
holder.subPic1.setTag(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[1]);
displayImage(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[1], holder.subPic1, options);
}
if(len > 2){
holder.subPic2.setTag(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[2]);
displayImage(HttpHead.HOST + "/data/images/thumbs/" + mDishs.get(position).images[2], holder.subPic2, options);
}
return convertView;
}private void displayImage(String url, final ImageView imageView, DisplayImageOptions options){
ImageLoader.getInstance().loadImage(url, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
imageView.setTag(imageUri);
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
}
@Override
public void onLoadingComplete(final String imageUri, final View view, final Bitmap loadedImage) {
final String tag = (String) imageView.getTag();
mHandler.post(new Runnable() {
@Override
public void run() {
if(imageUri.equals(tag)){
imageView.setImageBitmap(loadedImage);
imageView.setTag("");
}
}
});
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
});
}
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisc(true)
.showImageForEmptyUri(R.color.default_color)
.showImageOnFail(R.color.default_color)
.showStubImage(R.color.default_color)
.showImageOnLoading(R.color.default_color)
.imageScaleType(ImageScaleType.EXACTLY)
.bitmapConfig(Bitmap.Config.RGB_565)
.resetViewBeforeLoading()
.build();代码实现如上,我后来在imageview里设置了url作为tag,下载完成后去判断,但是仍然没规避问题
showStubImage 试试这个呢
showStubImage 试试这个呢showStubImage(R.color.default_color)
这个里面换成图片的资源试试呢?R.drawable.xxx
showStubImage(R.color.default_color)
这个里面换成图片的资源试试呢?R.drawable.xxx
imageView.setTag(url);在load的时候取这个imageView:public PhoneListAdapter(PhoneListActivity activity,ArrayList<CTPhone> list,ListView listView){}Bitmap b = CTChannelApplication.loader.loadBitmap(totalUrl, new ImageCallback(){
public void imageLoaded(Bitmap bitmap, String imageUrl) {
ImageView imageView = (ImageView)listView.findViewWithTag(imageUrl);
if(bitmap != null && imageView != null){
imageView.setImageBitmap(bitmap);
}
}
});
if(b != null){
imageView.setImageBitmap(b);
}else{
imageView.setImageBitmap(defaultBmp);
}