1) Избавьтесь от дисковых операций в getView(). Храните картинки в кэше (LRU или любой на WeakReference), если картинки в кэше нет, то отдавайте в getView заглушку, а саму картинку загружайте асинхронно посредством AsyncTask
2) Избавьтесь от создания объектов ImageView в getView если вторым параметром пришел не-null. В GridView встроена оптимизация, которая позволяет не создавать новые экземпляры вьюх, а использовать старые, показывая их на новом месте с новым контентом.