java – 通用图像加载程序:错误的位图附加到ImageView

前端之家收集整理的这篇文章主要介绍了java – 通用图像加载程序:错误的位图附加到ImageView前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在评估 NOSTRAUniversal-Image-Loader库以异步下载图像并在ListView中显示它们.到目前为止,除了一个问题之外,它的工作正常

有时,当列表被滚动时,内存缓存中的位图会附加到错误的ImageView中.滚动停止后,将附加正确的图像.这种情况是相当罕见的,我找不到100%的方式来复制它.我最后一次发生了video.

这是ArticleAdapter代码,可以在那里找到UIL配置和bindView()方法.

  1. public class ArticleAdapter extends CursorAdapter {
  2. private LayoutInflater inflater;
  3. private ViewHolder holder;
  4.  
  5. public ArticleAdapter(Context context,Cursor cursor,boolean autoRequery) {
  6. super(context,cursor,autoRequery);
  7. imageLoader = ImageLoader.getInstance();
  8. DisplayImageOptions options = new DisplayImageOptions.Builder()
  9. .showStubImage(R.drawable.download_progress_thumb)
  10. .cacheInMemory()
  11. .cacheOnDisc()
  12. .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
  13. .build();
  14. ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
  15. .threadPriority(Thread.NORM_PRIORITY - 2)
  16. .threadPoolSize(4)
  17. .discCache(new UnlimitedDiscCache(Utils.getCacheDirectory(context)))
  18. .defaultDisplayImageOptions(options)
  19. .build();
  20. imageLoader.init(configuration);
  21.  
  22. titleIndex = cursor.getColumnIndex(Articles.TITLE);
  23. descriptionIndex = cursor.getColumnIndex(Articles.DESCRIPTION);
  24. isUnreadIndex = cursor.getColumnIndex(Articles.IS_UNREAD);
  25. isNewIndex = cursor.getColumnIndex(Articles.IS_NEW);
  26. urlIndex = cursor.getColumnIndex(Articles.URL);
  27. hostIndex = cursor.getColumnIndex(Articles.HOST);
  28. timeIndex = cursor.getColumnIndex(Articles.PUBLISH_TIME);
  29.  
  30. bkgUnreadArticle = context.getResources().getColor(R.color.list_bkg_unread_article);
  31. bkgReadArticle = context.getResources().getColor(R.color.list_bkg_read_article);
  32. textUnreadTitle = context.getResources().getColor(R.color.list_text_unread_title);
  33. textReadTitle = context.getResources().getColor(R.color.list_text_read_title);
  34.  
  35. inflater = LayoutInflater.from(context);
  36. }
  37.  
  38. @Override
  39. public void bindView(View view,Context context,Cursor cursor) {
  40. String date = Utils.format(cursor.getLong(timeIndex),Utils.DATE);
  41. holder = (ViewHolder) view.getTag();
  42.  
  43. holder.titleView.setText(cursor.getString(titleIndex));
  44. holder.descriptionView.setText(date);
  45.  
  46. int isNew = cursor.getInt(isNewIndex);
  47. if (isNew == 1)
  48. holder.isNewView.setVisibility(View.VISIBLE);
  49. else
  50. holder.isNewView.setVisibility(View.INVISIBLE);
  51.  
  52. int isUnread = cursor.getInt(isUnreadIndex);
  53. if (isUnread == 1){
  54. holder.titleView.setTextColor(textUnreadTitle);
  55. holder.rowLayout.setBackgroundColor(bkgUnreadArticle);
  56. } else {
  57. holder.titleView.setTextColor(textReadTitle);
  58. holder.rowLayout.setBackgroundColor(bkgReadArticle);
  59. }
  60.  
  61. String url = cursor.getString(urlIndex);
  62. String host = cursor.getString(hostIndex);
  63. if (host.equalsIgnoreCase(Consts.HOST_LENTA) || host.equalsIgnoreCase(Consts.HOST_REALTY)) {
  64. holder.thumbView.setVisibility(View.VISIBLE);
  65. imageLoader.displayImage(Utils.makeImageUrl(url,Utils.THUMBNAIL),holder.thumbView);
  66. } else
  67. holder.thumbView.setVisibility(View.GONE);
  68. }
  69.  
  70. @Override
  71. public View newView(Context context,ViewGroup parent) {
  72. View v = inflater.inflate(R.layout.articlelist_item,null);
  73. ViewHolder holder = new ViewHolder();
  74. holder.titleView = (TextView) v.findViewById(R.id.list_title);
  75. holder.descriptionView = (TextView) v.findViewById(R.id.list_description);
  76. holder.thumbView = (ImageView) v.findViewById(R.id.list_thumb);
  77. holder.isNewView = (TextView) v.findViewById(R.id.list_read_unread);
  78. holder.rowLayout = (LinearLayout) v.findViewById(R.id.list_row);
  79.  
  80. v.setTag(holder);
  81. return v;
  82. }
  83. }

我真的很感谢任何关于这件事的帮助.

解决方法

对于ListViews,GridViews和其他列表,其中使用的视图在其适配器中重新使用,您应该在DisplayImageOptions中调用.resetViewBeforeLoading()来防止此效果.

另外文档说:

Init ImageLoader with configuration only once

你只做一次吗?适配器的构造函数不是它的好地方.

UPD:对不起,我的回答没有用. .resetViewBeforeLoading()没有帮助,因为您使用.showStubImage(…).所以你应该有正确的UIL工作,但你没有.这很奇怪

猜你在找的Java相关文章