原来的adapter的getview方法如下
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) convertView
.findViewById(R.id.item_imageview);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(
imgPathlist.get(position % imgPathlist.size()), options);
viewHolder.imageView.setImageBitmap(bitmap);// 为ImageView设置内容
viewHolder.imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
viewHolder.imageView.setLayoutParams(new LinearLayout.LayoutParams(
100, 100));
viewHolder.imageView.setBackgroundResource(mGalleryItemBackground);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
class ViewHolder {
ImageView imageView;
}
载入大量图片时候会内存溢出,错误提示:
12-10 17:49:21.393: E/AndroidRuntime(16350): FATAL EXCEPTION: main
12-10 17:49:21.393: E/AndroidRuntime(16350): java.lang.OutOfMemoryError
12-10 17:49:21.393: E/AndroidRuntime(16350): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
12-10 17:49:21.393: E/AndroidRuntime(16350): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527)
12-10 17:49:21.393: E/AndroidRuntime(16350): at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:301)
12-10 17:49:21.393: E/AndroidRuntime(16350): at com.smalt.photoview.MyAdapter.getView(MyAdapter.java:110)
参考stackoverflow上修改如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = new ViewHolder();
if (convertView == null) {
// 无convertView,需要new出各个控件
convertView = inflater.inflate(R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) convertView
.findViewById(R.id.item_imageview);
Bitmap bitmap = getBitmap(position, 20, 20);
viewHolder.imageView.setImageBitmap(bitmap);// 为ImageView设置内容
// 居中等比例缩放图片
viewHolder.imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
// 设置每个缩略图所占的宽高
viewHolder.imageView.setLayoutParams(new LinearLayout.LayoutParams(
100, 100));
// 设置边框效果
viewHolder.imageView.setBackgroundResource(mGalleryItemBackground);
convertView.setTag(viewHolder);
} else {
// 有convertView,按样式,取得不用的布局
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
/**
*
* 按照压缩比率获取bitmap,数字越大越清晰,压缩比越小
*
* @param position
* 位置
* @param width
* 压缩的宽度比率,越大越清晰
* @param height
* 压缩的高度比例,越大越清晰
* @return bitmap对象
*/
private Bitmap getBitmap(int position, int width, int height) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true; // 可以编码
BitmapFactory.decodeFile(
imgPathlist.get(position % imgPathlist.size()), options);
if (options.outHeight > 0 && options.outWidth > 0) {
options.inJustDecodeBounds = false;
options.inSampleSize = 2; // 长、宽缩小到原来的1/2,像素缩小到原来的1/4,减少内存的消耗
while (options.outWidth / options.inSampleSize > width
&& options.outHeight / options.inSampleSize > height) {
options.inSampleSize++; // 增加压缩比
Log.i("photo", "h-->" + options.outHeight + ",w---->"
+ options.outWidth + ",ss-->" + options.inSampleSize
+ ",压缩比-->" + options.outWidth / options.inSampleSize
+ "/" + options.outHeight / options.inSampleSize);
}
options.inSampleSize--;
bitmap = BitmapFactory.decodeFile(
imgPathlist.get(position % imgPathlist.size()), options);
if (bitmap != null) {
bitmap = Bitmap
.createScaledBitmap(bitmap, width, height, false);
}
}
return bitmap;
}
/**
*
* @Title:各个布局的控件资源
* @Description: 缩略图的映射
* @Copyright: Copyright (c) 2013
* @version: 1.0.0.0
* @Date: 2013-12-10
*/
class ViewHolder {
ImageView imageView;
}
显示效果: