2016-04-12 13 views
1

Şu anda uygulamadan görüntüleri daha sonra görüntülemek üzere dahili depolama birimine kaydedebilen bir uygulamanız var. Uygulamadaki tüm görsellerin bir galerisine sahip olmak istiyorum. Ancak 7 veya daha fazla resmi gridview'a yüklerseniz uygulama gecikmeye başlar ve bu etkinliği yüklemek biraz zaman alır.Görüntüleri dahili depolama alanından gridview'e yükleme işlemi nasıl optimize edilir

Bunu nasıl optimize edebileceğimi merak ediyordum. Kurma

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:

Yükleme ArrayList içine görüntüleri

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

imageLoader kitaplığını veya Picasso kütüphanesini kullanarak görüntüleri yüklemeniz gerekir. sadece bu ad ve google çok cevap bulacaksınız –

cevap

1

Eğer aktivite başladığında boş GridView başlatmak, çok sayıda dosya yüklüyorsanız, bir AsyncTask başlatması Resimlerinizi başka bir konuya yükler ve daha sonra GridView adaptörünüzü günceller. Veri yüklendiğinde, GridView'u güncellemek için notifyDatasetChanged()'u aramayı unutmayın.

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(); 
    } 
} 

Ve Faaliyetinizdeki: Örnek

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

Eğer yüzlerce görüntü olacaksa, bazı görüntüleri yüklemek her zaman birden Asynctasks kullanın ve güncellemek için daha iyi olacaktır Bu nedenle, kullanıcı tüm dosyalar için

0

'un birden fazla saniye beklememesini sağlar En iyi yol recent-images kitaplığını kullanmaktır. Bu çok basit. Sadece projenize kitaplık bağımlılığı ekleyin ve daha sonra sınıfınızın altına satırları koyun. Bağdaştırıcınız hazır, ızgara görünümünüz için ayarlayabilirsiniz.

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

Sorgularınızı resimlere göre özelleştirmek için bazı seçenekleri vardır.

İlgili konular