2014-01-18 4 views
0

Я позволяю пользователю рисовать материал в 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; 

} 
} 
+0

Попытка повторно использовать макет строки. Не надувайте его вообще при вызове getView. Очень нормально выходить из памяти с вашей реализацией в getView. – Devrim

+0

Прошу прощения, но я не совсем понял, что вы могли бы объяснить немного больше? когда вы используете «повторное использование макета строки», вы имеете в виду бесплатные элементы списка, которые в настоящее время не отображаются на экране? – Anonymous

ответ

0

Попробуйте использовать держатели, так что вы не раздувать ваш взгляд для каждого поскольку вы просто повторно используете их. Проверьте это: http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder Есть также тонны примеров в Интернете, рассказывающие, как использовать держатель в ArrayAdapter

+0

Я начинаю в android, поэтому, наверное, у меня есть домашнее задание. я проверю его, но, пожалуйста, скажите мне ... каким образом ваш подход спасет память? мне все еще нужно создать растровые изображения для всего списка, чтобы изменения изменились? – Anonymous

+0

Я полагаю, что если вы используете держатель, ваша память значительно улучшится. Просто испытайте это, дайте мне знать – alecnash

+0

Я не согласен. Я просто хочу лучше понять концепцию. (на всякий случай, если вы не заметили, что у меня нет растровых изображений, хранящихся в виде растровых изображений, я их воссоздаю программно) – Anonymous

0

Первое - прочитать: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Я думаю, что это позволяет сэкономить много насколько я понимаю, вы сделали что-то вроде атласа для ваших растровых изображений - это выглядит намного лучше.

Используя это решение даст вам также очень удобный способ распоряжаться растровые изображения: http://developer.android.com/reference/android/util/LruCache.html#entryRemoved(boolean, K, V, V)

Смежные вопросы