android – Lazy加载到ListView with Image. (光标适配器)

前端之家收集整理的这篇文章主要介绍了android – Lazy加载到ListView with Image. (光标适配器)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个列表视图显示视频与他们的缩略图,我正在使用光标适配器(使用ContentProvider的获取).问题是列表项增加列表视图的性能变得非常差.请让我知道最好的方法,使其懒惰加载.

新的:
最后我得到了一些解决方案.它的工作对我很好.如有任何建议,请通知我.
我的新代码在这里. (它使用堆栈与生产者消费者patern和bacground线程进行)

@覆盖
public void bindView(View view,Context context,Cursor cursor){

  1. ViewHolder holder = (ViewHolder) view.getTag();
  2. String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
  3. int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID));
  4. holder.getIdView().setText(name);
  5. holder.getThumbView().setTag((Integer)id);
  6. if(LazyLoader.getInstance().containsKey(id)) {
  7. Object bitmap = LazyLoader.getInstance().getBitMap(id);
  8. if(null != bitmap && (bitmap instanceof Bitmap)) {
  9. holder.getThumbView().setImageBitmap((Bitmap)bitmap);
  10. } else {
  11. holder.getThumbView().setImageDrawable(null);
  12. }
  13. } else {
  14. holder.getThumbView().setImageDrawable(null);
  15. LazyItem lazyItem = new LazyItem();
  16. lazyItem.setId(id);
  17. lazyItem.setThumbNail(holder.getThumbView());
  18. LazyLoader.getInstance().putItem(lazyItem);
  19. }
  20. }
  21.  
  22.  
  23.  
  24.  
  25. public class LazyLoaderHelper extends Thread {
  26.  
  27. private ContentResolver resolver = null;
  28. private Activity activity;
  29. private boolean isActive = true;
  30. ExecutorService executor;
  31.  
  32.  
  33. public LazyLoaderHelper(Activity _activity,ContentResolver _resolver) {
  34. resolver = _resolver;
  35. activity = _activity;
  36. isActive = true;
  37. executor = Executors.newFixedThreadPool(10);
  38. }
  39.  
  40. public void stopThread() {
  41. isActive = false;
  42. executor.shutdown();
  43. }
  44.  
  45. @Override
  46. public void run() {
  47. while (isActive) {
  48. if(LazyLoader.getInstance().getSize() > 0) {
  49. final LazyItem lazyItem = LazyLoader.getInstance().getItem();
  50. if(null != lazyItem) {
  51.  
  52. executor.execute(new Runnable() {
  53. @Override
  54. public void run() {
  55.  
  56. BitmapFactory.Options options = new BitmapFactory.Options();
  57. options.inSampleSize = 1;
  58.  
  59. if ((null != resolver) && (null != activity)) {
  60. final Bitmap thumb = MediaStore.Video.Thumbnails.getThumbnail(resolver,lazyItem.getId(),MediaStore.Video.Thumbnails.MICRO_KIND,options);
  61. if (null != thumb) {
  62. LazyLoader.getInstance().putBitMap(lazyItem.getId(),thumb);
  63. } else {
  64. LazyLoader.getInstance().putBitMap(lazyItem.getId(),new Object());
  65. }
  66.  
  67. if ((Integer) lazyItem.getThumbNail().getTag() == lazyItem.getId()) {
  68. activity.runOnUiThread(new Runnable() {
  69. @Override
  70. public void run() {
  71. if (null != thumb) {
  72. lazyItem.getThumbNail().setImageBitmap(thumb);
  73. } else {
  74. lazyItem.getThumbNail().setImageDrawable(null);
  75. }
  76. }
  77. });
  78. }
  79. }
  80. }
  81. });
  82. }
  83. }
  84.  
  85. }
  86. }
  87. }

解决方法

您可以使用picaso库的Android它是开源的,可以轻松地与您的应用程序集成,您可以从github从下面的链接下载库

http://square.github.io/picasso/

并且可以通过在列表视图适配器中使用以下方法轻松实现延迟加载

毕加索支持下载和错误占位符作为可选功能.

Picasso.with(上下文)
.load(URL)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(ImageView的);

所有资源,资产,文件,内容提供商都被作为图像来源.

Picasso.with(上下文).load(R.drawable.landing_screen).into(imageView1);Picasso.with(上下文).load( “文件:///android_asset/DvpvklR.png”).into(imageView2);Picasso.with(context).load(new File(…)).into(imageView3);

猜你在找的Android相关文章