ListView非常慢 - 安卓

时间:2015-06-20 10:53:35

标签: android performance listview android-listview android-asynctask

我想在我的ListView中显示资源目录中的图像(所有这些图像都以png格式保存),但它非常滞后。我是一个完整的菜鸟,所以我需要帮助处理异步任务以消除滞后。

列表适配器:

   public class MyListAdapter extends ArrayAdapter < SettingsItem > {

     Context context;
     List < SettingsItem > items;
     public MyListAdapter(Context context, int resource, List < SettingsItem > objects) {
       super(context, resource, objects);
       this.context = context;
       items = objects;
     }

     @Override
     public View getView(int position, View itemView, ViewGroup parent) {

       ViewHolder holder;
       if (itemView == null) {
         LayoutInflater inflater = ((Activity) context).getLayoutInflater();
         itemView = inflater.inflate(R.layout.settings_items, parent, false);

         holder = new ViewHolder();
         holder.imageView = (ImageView) itemView.findViewById(R.id.item_icon);
         holder.textView = (TextView) itemView.findViewById(R.id.item_text);

         itemView.setTag(holder);
       } else {
         holder = (ViewHolder) itemView.getTag();
       }

       SettingsItem settingsItem = items.get(position);

       if (settingsItem != null) {
         holder.textView.setText(settingsItem.getName());
         new ImageDownloaderTask(holder.imageView, getContext(), settingsItem.getIcon_id()).execute();
       }
       return itemView;
     }
     static class ViewHolder {
       ImageView imageView;
       TextView textView;
     }
   }

行类:

public class SettingsItem{
    private String name;
    private int icon_id;
    public SettingsItem(String a, int b){

        super();
        name=a;
        icon_id=b;
    }

    public String getName() {
        return name;
    }

    public int getIcon_id() {
        return icon_id;
    }
}

的AsyncTask:

class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    Context context;
    int id;
    public ImageDownloaderTask(ImageView imageView, Context context, int id) {
        imageViewReference = new WeakReference<ImageView>(imageView);
        this.context=context;
        this.id=id;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return BitmapFactory.decodeResource(context.getResources(),id );
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                if (bitmap != null) {
                    imageView.setImageBitmap(bitmap);
                } else {
                    imageView.setImageResource(R.drawable.medical_bag);
                }
            }
        }
    }
}

我真的需要一些帮助。
提前致谢。 :)

3 个答案:

答案 0 :(得分:4)

我建议您使用Glide库,这会为您的应用中的图片加载带来性能,并且非常易于使用。 它还支持提取,解码和显示视频静止图像,图像和动画GIF。

它可以使任何类型的图像列表尽可能平滑和快速地滚动,但Glide对于您需要获取,调整大小和显示远程图像的几乎任何情况都是有效的。

  

Glide是一种快速高效的开源媒体管理和图像   Android的加载框架包装媒体解码,内存和   磁盘缓存,资源池化成简单易用   接口

将Glide添加到您的项目中:

dependencies {
    compile 'com.github.bumptech.glide:glide:3.6.0'
    compile 'com.android.support:support-v4:19.1.0'
}

对于列表视图,官方页面的用法如下:

@Override
public View getView(int position, View recycled, ViewGroup container) {
    final ImageView myImageView;
    if (recycled == null) {
        myImageView = (ImageView) inflater.inflate(R.layout.my_image_view,
                container, false);
    } else {
        myImageView = (ImageView) recycled;
    }

    String url = myUrls.get(position);

    Glide.with(myFragment)
        .load(url)
        .centerCrop()
        .placeholder(R.drawable.loading_spinner)
        .crossFade()
        .into(myImageView);

    return myImageView;
}

供参考使用此库以加快图像加载和更好滚动的另一个项目:https://github.com/chrisbanes/cheesesquare

答案 1 :(得分:3)

要在应用中创建复杂列表,您可以使用RecyclerView。在https://developer.android.com/training/material/lists-cards.html中阅读有关回收者视图的更多信息。

要显示图像,请使用滑行。 https://github.com/bumptech/glide。它是一个很棒的库,可以为您完成所有内存管理。在imageview中加载位图有点痛苦。

答案 2 :(得分:2)

您可以使用缓存来加快显示速度。我正在使用毕加索http://square.github.io/picasso,这对于轻松显示图片和处理缓存非常有用。希望它有所帮助。

Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);