我目前有一个应用程序可以将图像从应用程序保存到内部存储器以供以后查看。我想在应用程序中拥有所有图像的画廊。但是,如果我将 7 张或更多图片加载到 gridview
中,应用程序就会开始滞后,加载该 Activity 将需要一些时间。
所以我想知道如何优化它。
将图像加载到 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);
最佳答案
如果您正在加载大量文件,请在 Activity 开始时初始化一个空的 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();
}
}
在您的 Activity 中:
public void update(ArrayList<ImageItem> imageItems) {
//update your adapter's data, and refresh the GridView
}
如果你有数百张图片,最好使用多个异步任务,并在每次加载一些图片时更新,这样用户就不会等待几秒钟来加载所有文件
关于android - 如何优化从内部存储加载图像到 gridview,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36568893/