【发布时间】:2015-04-15 10:01:49
【问题描述】:
使用大量本地图像滚动 网格视图 使我的应用程序在具有少量 RAM 的设备中崩溃并显示消息 java.lang.OutOfMemoryError 或至少在性能良好的设备中它几乎不能滚动 和滞后。我仔细寻找解决方案,发现远程图像存在一些好的解决方案,例如: Universal-Image-Loader,它从网络加载图像并兑现它们并管理滚动。但我不能在我的情况下使用它。
这是我加载图像的适配器:
public class MyAdapter extends ArrayAdapter<StructureCase> {
private LayoutInflater mInflater = null;
public Context context;
public Class distinationActivity = null;
public MyAdapter(Context context, int textViewResourceId, List<StructureCase> objects) {
super(context, textViewResourceId, objects);
mInflater = LayoutInflater.from(context);
// mInflater = (LayoutInflater)G.currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public static class ViewHolder {
public ImageView gem_img = null;
public TextView gem_name = null;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final View v;
final StructureCase item = getItem(position);
if (convertView == null) {
convertView = this.mInflater.inflate(R.layout.my_grid_list, null);
//mInflater = (LayoutInflater)G.currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.my_grid_list, parent, false);
viewHolder = new ViewHolder();
convertView.setTag(viewHolder);
viewHolder.gem_img = (ImageView) convertView.findViewById(R.id.imageView_mygrid_list);
viewHolder.gem_name = (TextView) convertView.findViewById(R.id.textView_mygrid_list);
viewHolder.gem_name.setTypeface(G.typeFacePrs);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.gem_name.setText(item.g_name);
int id = G.currentActivity.getResources().getIdentifier(item.g_image+"_tmb", "drawable", G.currentActivity.getPackageName());
if(id != 0){
Drawable drawable = G.currentActivity.getResources().getDrawable(id);
viewHolder.gem_img.setImageDrawable(drawable);
}else{
viewHolder.gem_img.setImageResource(R.drawable.gem1);
}
viewHolder.gem_img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(G.currentActivity, GemDetaileActivity.class);
i.putExtra("id", item.g_ID);
i.putExtra("content", item.g_text);
i.putExtra("name", item.g_name);
i.putExtra("name_en", item.g_name_en);
i.putExtra("image", item.g_image);
i.putExtra("image_count", item.g_image_count);
i.putExtra("hadis", item.g_hadis);
i.putExtra("good_for", item.g_good_for);
G.currentActivity.startActivity(i);
G.currentActivity.overridePendingTransition(R.anim.in_left_2_right, R.anim.out_left_2_right);
}
});
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
}
我认为我的问题是预加载所有图像,如果有办法在滚动显示它的项目后立即将 Drawable 加载到图像视图,我的问题将解决。
【问题讨论】:
-
List<StructureCase> objects。你对objects什么都不做。getItem(position);。您省略了 getItem() 的代码。请加。Drawable drawable = G.currentActivity.getResources().getDrawable(id); viewHolder.gem_img.setImageDrawable(drawable);将其更改为一条语句viewHolder.gem_img.setImageResource(id);。 -
进一步:如果您的应用程序崩溃,您将在 logcat 中看到一个错误报告,告诉您原因。请告知并发布 logcat 中的相关部分。
-
谢谢。但预载没有任何变化。所有图像都在开始时加载并且仍然滚动会使应用程序崩溃。我也使用了 StructureCase item = getItem(position);从我的对象中获取示例图像名称:item.g_image
-
@greenapps 我更新了问题。
-
请对我所有的 cmets 和建议作出反应。你对他们做了什么?
标签: android image listview scroll out-of-memory