SimpleCursorAdapter中的通用图像加载器随机播放图像

时间:2014-08-05 12:11:34

标签: android listview universal-image-loader

我的ListView在每个列表行中使用自定义SimpleCursorAdapterImageView

使用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;

}

1 个答案:

答案 0 :(得分:0)

这是因为ListView回收了视图。因此,填充图像的最后ImageView将返回相同的图像,除非您为其设置另一个图像或清除它。因此,如果您没有设置图像,则必须清除ImageView

这也可能发生这种情况:

  1. 您将ImageView设置为另一个图像
  2. 您的ImageView将显示错误的图片(之前离开的图片 屏幕边界可能)

  3. 然后加载正确的图像

  4. 我认为您的Imageloaders .showImageForEmptyUri(R.drawable.empty_uri)并没有真正起作用。 或者.delayBeforeLoading(200)可能导致它。它可以卡住线程(因为线程池限制很小)

    如果这些没有解决,我的解决方案是在手动加载之前清除图像视图。与您的占位符图像。

    我建议使用Picasso代替UniversalImageLoader来缓解你的痛苦。(如果你的工作不依赖于它)