Задать вопрос

Android: GridView и кастомный адаптер — как избежать тормозов на большом количестве данных при отображения?

Есть GridView и кастомный ImageAdapter, унаследованный от BaseAdapter. Задумка такова: есть папака с фотографиями на андроид устройствеб которая сканируется и все фотографии этой папки выводятся в GridView.


Пробую делать так: в конструкторе адаптера осуществляется выборка всех фотографий и сохранение абсолютных путей в массив строк. В своем адаптере переопределен метод View getView(), в котором динамически создается ImageView, в которое вставляется фотография посредством BitmapFactory.


Так вот на большом количестве фотографий в папке (сотни полторы-две) GridView ужасно тормозит. Я подозреваю, что это происходит по двум причинам:

1) Возможно нужно ужимать засовываемую в ImageView Фотографию.

2) Неправильно в методе getView() адаптера каждый раз создавать экзэмпляр ImageView.


Правильны ли мои догадки? как грамотно реализовать отображение списка фото из папки в GridView?
  • Вопрос задан
  • 12158 просмотров
Подписаться 8 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
firexel
@firexel
1) Избавьтесь от дисковых операций в getView(). Храните картинки в кэше (LRU или любой на WeakReference), если картинки в кэше нет, то отдавайте в getView заглушку, а саму картинку загружайте асинхронно посредством AsyncTask

2) Избавьтесь от создания объектов ImageView в getView если вторым параметром пришел не-null. В GridView встроена оптимизация, которая позволяет не создавать новые экземпляры вьюх, а использовать старые, показывая их на новом месте с новым контентом.
Ответ написан
FluffyMan
@FluffyMan Автор вопроса
Вот код адаптера:

package com.example.phocom;

import java.io.File;
import java.io.FilenameFilter;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Environment;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

public class ImageAdapter extends BaseAdapter 
{
	private Context mContext;
	private String[] data = {"1"};
	
	BitmapFactory.Options options = new BitmapFactory.Options();
	Bitmap btm;
	ImageView view;

	public ImageAdapter(Context сontext) 
	{
		mContext = сontext;
		
		options.inSampleSize = 2;
		
		// получаю список фотографий в папке /DCIM/Camera на sd-карте
		File rootsd = Environment.getExternalStorageDirectory();
        File dcim = new File(rootsd.getAbsolutePath() + "/DCIM/Camera");
        
        File[] imagelist = dcim.listFiles(new FilenameFilter()
        {
        	public boolean accept(File dir, String name)
        	{
        		return ((name.endsWith(".jpg"))||(name.endsWith(".png")));
        	}
        });
                
        // сохраняю пути к фотографиям в стринг массиве
        if (imagelist != null)
        {
            data = new String[imagelist.length];

        	for (int i = 0; i < imagelist.length; i++)
        	{
        		data[i] = imagelist[i].getAbsolutePath();
        	}
        }
	}

	public int getCount() 
	{
		return data.length;
	}

	public Object getItem(int position) 
	{
		return null;
	}

	public long getItemId(int position) 
	{
		return 0;
	}

	public View getView(int position, View convertView, ViewGroup parent) 
	{		
		if (convertView == null)
		{
			view = new ImageView(mContext);
			view.setLayoutParams(new GridView.LayoutParams(100, 100));
			view.setScaleType(ImageView.ScaleType.CENTER_CROP);
		} else
		{
			view = (ImageView)convertView;
		}
		
    	btm = BitmapFactory.decodeFile(data[position], options);
		view.setImageBitmap(btm);
		
		return view;
	}
}


firexel, второй пункт из Ыашего ответа как понимаю я реализовал. Но вот по поводу первого я не совсем понял. Мне в асинхтаск нужно что делать? вызывать метод getView()?
Ответ написан
ara89
@ara89
Попробуйте еще недавно вышедшую библиотеку Smoothie, ну или ее концепты
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы