【问题标题】:How to optimize loading images into gridview from internal storage如何优化从内部存储加载图像到gridview
【发布时间】:2016-04-12 09:20:39
【问题描述】:

我目前有一个应用程序,可以将应用程序中的图像保存到内部存储以供以后查看。我想拥有应用程序中所有图像的图库。但是,如果我将 7 个或更多图像加载到 gridview 中,应用程序就会开始滞后,并且需要一些时间来加载该活动。

所以我想知道如何优化它。

将图片加载到ArrayList

final ArrayList<ImageItem> imageItems = new ArrayList<>();
    //TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
    for (int i = 1; i < getApplicationContext().fileList().length; i++) {
        String[] names = getApplicationContext().fileList();
        Log.d("HIER:", names[i]);
        Bitmap b = null;
        try{
            InputStream is = getApplicationContext().openFileInput(names[i]);
            b = BitmapFactory.decodeStream(is);
        } catch(Exception e){
            e.printStackTrace();
        }
        //arrayList.add(new ImageItem(Bitmap.createScaledBitmap(b, 100, 100, false), names[i]));
        arrayList.add(new ImageItem(b, names[i]));

设置gridview

gridView = (GridView) findViewById(R.id.gridView);
    gridAdapter = new GridViewAdapter(this, R.layout.favorite_item, arrayList);
    gridView.setAdapter(gridAdapter);

【问题讨论】:

  • 您需要使用 imageLoader 库或 Picasso 库来加载图像。谷歌这些名字,你会找到很多答案

标签: android android-studio gridview


【解决方案1】:

如果您正在加载大量文件,请在活动开始时初始化一个空的GridView,启动一个在另一个线程中加载您的图像的AsyncTask,然后更新您的GridView 适配器。加载数据时,记得调用notifyDatasetChanged()更新GridView

例子:

public class ImageLoader extends AsyncTask<Void, Void, ArrayList<ImageItem>> {

YourActivity activity;

public ImageLoader(YourActivity activity) {
    this.activity = activity;
}

@Override
protected ArrayList<ImageItem> doInBackground(Void... params) {
    ArrayList<ImageItem> imageItems = new ArrayList<>();
    //load your images
    return imageItems;
}

@Override
protected void onPostExecute(ArrayList<ImageItem> imageItems) {
    //call a method from your Activity, that updates the Adapter using the retrieved array
    activity.update();
  }
}

在你的活动中:

public void update(ArrayList<ImageItem> imageItems) {
    //update your adapter's data, and refresh the GridView
}

如果你有数百张图片,最好使用多个 Asynctask,并在每次加载一些图片时更新,这样用户就不会等待几秒钟来加载所有文件

【讨论】:

    【解决方案2】:

    最好的方法是使用recent-images 库。就是这么简单。只需将库依赖项添加到您的项目中,然后将下面的行添加到您的类中。您的适配器已准备就绪,您可以为您的 gridview 设置它。

    RecentImages ri = new RecentImages();
    ImageAdapter adapter = ri.getAdapter(MainActivity.this);
    

    它有一些选项可以自定义您对图像的查询。

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多