2016-04-12 17 views
1

現在、アプリから内部ストレージに画像を保存して後で表示できるアプリがあります。私はアプリ内のすべての画像のギャラリーを持っています。しかし、私がgridviewに7つ以上の画像を読み込むと、アプリが遅れを開始し、その動作を読み込むのに時間がかかるでしょう。内部ストレージから画像をグリッドビューに読み込む方法を最適化する方法

私はこれをどのように最適化できるのだろうかと思っていました。セットアップ

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

ロードArrayListに画像

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

imageLoaderライブラリまたはPicassoライブラリを使用して画像を読み込む必要があります。ちょうどGoogleこれらの名前と多くの答えを見つけるだろう –

答えて

1

あなたは活動が始まり、空GridViewを初期化し、たくさんのファイルをロードする場合、AsyncTaskを起動しています別のスレッドでイメージをロードし、その後GridViewアダプタを更新します。データがロードされたときは、を更新するためにnotifyDatasetChanged()と覚えておいてください。

例:

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 
} 

あなたは画像の数百を持っている場合は、複数のAsynctasksを使用する方がよい、とあなたには、いくつかのイメージをロードするたびに更新されますので、ユーザーがすべてのファイルがロードされるまで数秒待たないでください

0

ベストウェイはrecent-imagesライブラリを使用することです。それはとても簡単です。あなたのプロジェクトにライブラリの依存関係を追加して、クラスに以下の行を追加するだけです。あなたのアダプタは準備が整いました。あなたのグリッドビュー用に設定することができます。

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

画像にクエリをカスタマイズするオプションがあります。

関連する問題