gpt4 book ai didi

android:在 viewpager 中使用 gridview 显示 156 张图像

转载 作者:太空狗 更新时间:2023-10-29 15:04:50 25 4
gpt4 key购买 nike

我想使用 18 页的 Viewpager 显示 156 个缩略图,每个页面有 9 个缩略图。我已经实现如下:

Index_gridview类:

public void init() 
{
PageCount = (int) Math.ceil(mThumbIds.length / PAGE_SIZE);
mLists = new ArrayList<GridView>();

for (int i = 0; i < PageCount; i++)
{
GridView gv = new GridView(this);
gv.setAdapter(new MyGridViewAdapter(this, mStrs, mThumbIds, i, icon_dimension));
gv.setGravity(Gravity.CENTER);
gv.setClickable(true);
gv.setFocusable(true);
gv.setNumColumns(NUMOFCOLUMN);
gv.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
gv.setHorizontalSpacing(gridview_horizontal_padding);
gv.setVerticalSpacing(gridview_vertical_padding);
mLists.add(gv);
}
page_number.setText("1/"+PageCount);
}

GridViewAdapter 类:

public class MyGridViewAdapter extends BaseAdapter 
{
private Animation zoom = null;
// view
int icon_width, icon_height;
Typeface tf;
private Context mContext;
private List<String> mLists;
public static final int PAGE_SIZE = 9; // showing how many items in 1 page

public MyGridViewAdapter(Context pContext, String[] pStrs, Integer[] image_ref, int page, int width)
{
this.mContext = pContext;
mLists = new ArrayList<String>();
int i = page * PAGE_SIZE;
int end = i + PAGE_SIZE;
while ((i < image_ref.length) && (i < end))
{
mLists.add(pStrs[i]);
i++;
}

icon_width = width;
icon_height = icon_width;

tf = Typeface.createFromAsset(mContext.getAssets(),"fonts/HomegirlKiddo.ttf");
}

@Override
public int getCount()
{
return mLists.size();
}
@Override
public Object getItem(int position)
{
return mLists.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if (convertView == null)
{
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.menugrid, parent, false);
holder = new ViewHolder();

holder.img = (ImageView) convertView.findViewById(R.id.imageicon);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}


final int myNum = Integer.parseInt(mLists.get(position)) -1;
ImageView imageView = holder.img;

try
{
imageView.setImageBitmap(decodeSampledBitmapFromResource(mContext.getResources(), mThumbIds[myNum], icon_width, icon_width));
}
catch (OutOfMemoryError e)
{
((Index_Gridview)mContext).custom_toast("System Out-of-Error! Restarting...");
((Index_Gridview)mContext).restart_app();
}


imageView.setOnClickListener(new OnImageClickListener(myNum));
return convertView;
}

private Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight)
{
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);

// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}

private int calculateInSampleSize (BitmapFactory.Options options, int reqWidth, int reqHeight)
{
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth)
{
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);

// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}

class ViewHolder
{
ImageView img;
}

// References to our images in res > drawable
public Integer[] mThumbIds = new Integer[]
{
R.drawable.t_aaa,
R.drawable.t_bbb,
....listing of 156 image references here
}

问题:

我已经尝试通过“decodeSampledBitmapFromResource”导入缩略图。每个原始缩略图大约 75KB。

很容易遇到OOM。如何增强代码以减轻 OOM 错误?

谢谢!!

最佳答案

您可以尝试使用 RAM 和磁盘缓存来重用您的位图。

这是 android 支持 v4 中 LRUCache 的链接:

http://developer.android.com/reference/android/support/v4/util/LruCache.html

这是 Jake Wharton 的 DiskLRUCache 项目的链接

https://github.com/JakeWharton/DiskLruCache

关于android:在 viewpager 中使用 gridview 显示 156 张图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23042388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com