2014-02-23 29 views
0

我在我的应用程序中有一个Gridview,但问题是它再次加载所有图像,因为我滚动导致严重滞后,我如何使它加载所有图像一次并缓存它?如何预加载GridView中的所有图像? - Android

package com.example.helloworld; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 

    // Constructor 
public ImageAdapter(Context c) { 
    mContext = c; 
    } 

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

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

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

    // create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { 
    imageView = new ImageView(mContext); 
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
    imageView.setPadding(8, 8, 8, 8); 
    } else { 
    imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
    } 

    // Keep all Images in array 
    public Integer[] mThumbIds = { 
    R.drawable.sample_0, 
    R.drawable.sample_1, 
    R.drawable.sample_2, 
    R.drawable.sample_3, 
    R.drawable.sample_4, 
    R.drawable.sample_5, 
    R.drawable.sample_6, 
    R.drawable.sample_7, 
    R.drawable.sample_8, 
    R.drawable.sample_9, 
    R.drawable.sample_10, 
    R.drawable.sample_11, 
    R.drawable.sample_12, 
    R.drawable.sample_13, 
    R.drawable.sample_14, 
    R.drawable.sample_15, 
    R.drawable.sample_16, 
    R.drawable.sample_17 

    }; 
    } 

回答

0

如果你看一下setImageResource它说,它可能会导致缓慢的UI的方法的文档。该文档提供了一种替代方法:使用setImageDrawable。第二件事,看起来ImageAdapter在每次滚动GridView时调用ImageView的setImageResource方法,而不是在生成GridView时调用一次。你可以通过增加图像数组的范围来解决这个问题。这在这种情况下效果很好,因为GridView始终具有与mThumbIds数组定义的元素数相同的元素数。

例子:

若要产生一次的所有图像,添加一个可绘制数组类,并将它建设过程中填满:

public class ImageAdapter extends BaseAdapter { 

    private Context mContext; 
    // Added drawable array: 
    private Drawable[] mDrawables; 

    public ImageAdapter(Context c) { 

     mContext = c; 

     // Fill in drawables with the images: 
     for (int i = 0; i < mThumbIds.length; i++) { 
     Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), mThumbIds[i]); 
     mDrawables[i] = new BitmapDrawable(mContext.getResources(), bitmap); 
     } 
    } ` 

现在,所有你需要做的就是改变为setImageResource和setImageDrawable传递mDrawables阵列的成员:

public View getView(int position, View convertView, ViewGroup parent) { 

    ImageView imageView; 
    if (convertView == null) { 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
    imageView = (ImageView) convertView; 
    } 

    // Changed to setImageDrawable: 
    imageView.setImageDrawable(mDrawables[pposition]); 
    return imageView; 
} 

其结果是,图像将被加载到可绘只有一次和STO红色,setImageDrawable将更快地访问这些图像,修复滚动。