我的ListView在每个列表行中使用自定义SimpleCursorAdapter
和ImageView
。
使用Universal Image Loader library
将图像添加到ImageViews。当我在ListView
中向上和向下滚动时,图像会被洗牌。应该为空的某些行突然保持另一行的图像。当我向上和向下滚动半分钟时,所有应该为空的行都会填充其他行的图像。
我认为recycling problem
有一个ImageLoader
。我不得不说适配器在TextViews上工作得很好,这就是我认为问题必须与ImageLoader一致的原因。
这是我的代码:
我只在整个应用程序中初始化配置一次。这是肯定的。
此代码位于我的MainActivity
:
File cacheDir = StorageUtils.getCacheDirectory(this);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.diskCache(new UnlimitedDiscCache(cacheDir))
.diskCacheSize(20 * 1024 * 1024)
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
.threadPoolSize(3)
.threadPriority(4)
.build();
ImageLoader.getInstance().init(config);
这是我的适配器(我删除了与TextView相关的内容以获得更好的概述):
public class MyAdapter extends SimpleCursorAdapter {
ImageLoader imageLoader;
DisplayImageOptions options;
public MyAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
super(context, layout, c, from, to, flags);
imageLoader = ImageLoader.getInstance();
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.on_loading)
.showImageForEmptyUri(R.drawable.empty_uri)
.showImageOnFail(R.drawable.on_fail)
.resetViewBeforeLoading(true)
.delayBeforeLoading(200)
.cacheInMemory(false)
.cacheOnDisk(true)
.build();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
ViewHolder vH = new ViewHolder();
LinearLayout main = new LinearLayout(context);
ImageView imageView = new ImageView(context);
main.addView(imageView)
vH.imageView = imageView;
main.setTag(vH);
return main;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder vH = (ViewHolder) view.getTag();
imageLoader.displayImage("file://" + cursor.getString(cursor.getColumnIndex(MyDatabase.COLUMN_ONE)), vH.imageView, options);
}
private static class ViewHolder {
ImageView imageView;
}
答案 0 :(得分:0)
这是因为ListView
回收了视图。因此,填充图像的最后ImageView
将返回相同的图像,除非您为其设置另一个图像或清除它。因此,如果您没有设置图像,则必须清除ImageView
。
这也可能发生这种情况:
ImageView
设置为另一个图像您的ImageView
将显示错误的图片(之前离开的图片
屏幕边界可能)
然后加载正确的图像
我认为您的Imageloaders .showImageForEmptyUri(R.drawable.empty_uri)
并没有真正起作用。
或者.delayBeforeLoading(200)
可能导致它。它可以卡住线程(因为线程池限制很小)
如果这些没有解决,我的解决方案是在手动加载之前清除图像视图。与您的占位符图像。
我建议使用Picasso代替UniversalImageLoader来缓解你的痛苦。(如果你的工作不依赖于它)