Я позволяю пользователю рисовать материал в ImageView и нажимать Сохранить, чтобы сохранить чертеж. Позже пользователь может видеть все сохраненные чертежи в ListView, у которого есть ImageView и два TextView с некоторыми деталями.ListView из растровых изображений заканчивается из памяти (решено)
Во избежание сохранения и извлечения растровых изображений я сохраняю все x-y-точки, которые были нарисованы в txt-файле, и воссоздают растровые изображения при заполнении списка с использованием метода createBitmap, нарисованного точек и установки растрового изображения в ImageView внутри адаптера.
Когда пользователь удаляет или обновляет список, я завершаю и перезапускаю операцию списка, чтобы перезагрузить файл, и все эти растровые изображения воссозданы, но предыдущие не переработаны, потому что я не знаю, где вызвать метод утилизации!
Так что проблема в том, что иногда я получаю ошибку OutOfMemory из-за всех растровых изображений. ВОПРОС: Где я могу назвать рециркуляцию для растровых изображений или как еще я могу осуществить это без использования так много памятей это адаптер списка
public class CustomGalleryListAdapter extends ArrayAdapter<String>{
private final Activity context;
private final String[] name_plus_details;
private final String[] imageinfo;
public CustomGalleryListAdapter(Activity context,
String[] name_plus_details, String[] imageinfo) {
super(context, R.layout.gallery_list_single_item_layout, name_plus_details);
this.context = context;
this.name_plus_details = name_plus_details;
this.imageinfo = imageinfo;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
Paint mPaint,mPaint2;
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(23/4);
mPaint2 = new Paint();
mPaint2.setAntiAlias(true);
mPaint2.setDither(true);
mPaint2.setColor(Color.GREEN);
mPaint2.setStyle(Paint.Style.STROKE);
mPaint2.setStrokeJoin(Paint.Join.ROUND);
mPaint2.setStrokeCap(Paint.Cap.ROUND);
mPaint2.setStrokeWidth(17/4);
LayoutInflater inflater = context.getLayoutInflater();
Bitmap mBitmap = Bitmap.createBitmap(600/5, 700/5, Bitmap.Config.ARGB_8888);
Canvas mCanvas = new Canvas(mBitmap);
String[] imagedata = imageinfo[position].split(":");
String[] points;
for(int i=0;i<imagedata.length;i++){
if(imagedata[i].contains(";")){
points=imagedata[i].split(";");
if(points[0].length()>0){
int drawx1 = Integer.parseInt(points[0].split(",")[0]);
int drawy1 = Integer.parseInt(points[0].split(",")[1]);
mCanvas.drawCircle(drawx1/5, drawy1/5, 15/4, mPaint2);
}
for(int h=0;h+1<points.length-1;h++){
int drawx1 = Integer.parseInt(points[h].split(",")[0]);
int drawy1 = Integer.parseInt(points[h].split(",")[1]);
int drawx2 = Integer.parseInt(points[h+1].split(",")[0]);
int drawy2 = Integer.parseInt(points[h+1].split(",")[1]);
mCanvas.drawLine(drawx1/5, drawy1/5, drawx2/5, drawy2/5, mPaint);
}
}
}
View rowView= inflater.inflate(R.layout.gallery_list_single_item_layout, null, true);
TextView detailsTextView = (TextView) rowView.findViewById(R.id.txt);
TextView name_field = (TextView) rowView.findViewById(R.id.gallery_name_field);
ImageView imageView = (ImageView) rowView.findViewById(R.id.img);
imageView.setImageDrawable(new BitmapDrawable(getContext().getResources(),mBitmap));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setBackgroundColor(Color.GRAY);
String[] text_parts = name_plus_details[position].split("ENDNAME");
name_field.setText(text_parts[0]);
detailsTextView.setText("\n"+text_parts[1]);
return rowView;
}
}
Попытка повторно использовать макет строки. Не надувайте его вообще при вызове getView. Очень нормально выходить из памяти с вашей реализацией в getView. – Devrim
Прошу прощения, но я не совсем понял, что вы могли бы объяснить немного больше? когда вы используете «повторное использование макета строки», вы имеете в виду бесплатные элементы списка, которые в настоящее время не отображаются на экране? – Anonymous