【问题标题】:Universal Image Loader in SimpleCursorAdapter shuffle imagesSimpleCursorAdapter 中的通用图像加载器随机播放图像
【发布时间】:2014-09-28 02:20:50
【问题描述】:

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

图像被添加到带有Universal Image Loader library 的ImageViews。当我在ListView 中上下滚动时,图像会被打乱。一些本应为空的行突然保留了另一行的图像。当我上下滚动半分钟时,所有应该为空的行都被其他行的图像填充。

我认为有一个recycling problemImageLoader。我不得不说适配器在 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;

}

【问题讨论】:

    标签: android listview universal-image-loader


    【解决方案1】:

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

    这种情况也可能发生:

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

    3. 然后加载正确的图片

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

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

    我建议使用 Picasso 而不是 UniversalImageLoader 来减轻你的痛苦。(如果你的工作当然不依赖它)

    【讨论】:

      猜你喜欢
      • 2022-07-10
      • 2013-03-06
      • 2014-10-10
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      相关资源
      最近更新 更多