2016-06-18 2 views
0

У меня есть ListView и GridView как вызывает у меня проблемы и OutOfMemory ошибки при прокрутке, я прочитал в Интернете о проблеме и увидел this вопрос, поэтому я использовал первое решение Сунило и реализовал его в своем коде. изображения для GridView и ListView находятся на «/res/drawable/image1.png» и так далее, я перешла к CustomAdapter класса это целочисленный массив public static int[] mDrawableImg = {R.drawable.back, R.drawable.arrows, R.drawable.bomber, R.drawable.archers, R.drawable.knight}; и использовал:андроид ListView OutOfMemory - ImageBitmaps

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final Holder holder = new Holder(); 
    final View rowView = inflater.inflate(R.layout.program_list2, null); 
    holder.img = (ImageView) rowView.findViewById(R.id.imageView1); 
     holder.img.setImageResource(imageId[position]); 
    // holder.img.setImageBitmap(convertBitmap(String.valueOf(imageId[position]))); 
      return rowView; 
} 

Теперь, как вы видите, я добавил строка кода для загрузки изображения с Bitmap с функцией convertBitmap, но мой GridView пуст, его прокручиваемое значение есть, но изображения не загружаются.

convertBitmapФункция:

public static Bitmap convertBitmap(String path) { 
    Bitmap bitmap = null; 
    BitmapFactory.Options bfOptions = new BitmapFactory.Options(); 
    bfOptions.inDither = false; 
    bfOptions.inTempStorage = new byte[32 * 1024]; 
    File file = new File(path); 
    FileInputStream fs = null; 
    try { 
     fs = new FileInputStream(file); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     if (fs != null) { 
      bitmap = BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (fs != null) { 
      try { 
       fs.close(); 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 
     } 
    } 
    return bitmap; 
} 

Что я сделал не так, и это будет решать мои OutOfMemory ошибки? Благодарю.

ответ

1

Ошибка, которую вы получаете, абсолютно логична. Посмотрите данная запись в вашем способе getView():

final View rowView = inflater.inflate(R.layout.program_list2, null);

Что это значит? Это означает, что вы создаете новый экземпляр элемента каждый раз, когда Android запрашивает у вас View. Это очень сумасшествие, потому что вы просто создаете и создаете больше просмотров, пока вы прокручиваете ListView (так что довольно естественно, что вы получаете ошибку в памяти. И я уверен, что ваш ListView прокручивает laggy).

И я уверен, что Android Studio предупреждает вас об этой проблеме, отметив эту строку желтым цветом.

К счастью, вы можете исправить это очень легко. Но позвольте мне сказать вам кое-что. Посмотрите на View, который вы принимаете в методе getView() в качестве параметра. Разве вы не видите? Переменная, которую вы назвали convertView. И обратите внимание, что вы не используете его. Что это такое View? Вызывается переработанным представлением (не путать с классом RecyclerView). Представление, которое ранее было завышено и больше не используется, потому что оно не отображается для пользователя. И это, мой друг, это ключ к вашей проблеме, а также вашего решения: вместо того, чтобы каждый раз раздувать один новый вид, просто переработайте его. Я обещаю, что вы очень просты. Теперь ваши getView Митос должен выглядеть следующим образом:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) 
     convertView = inflater.inflate(R.layout.program_list2, null); 

    //final Holder holder = new Holder(); 
    //holder.img = (ImageView) convertView.findViewById(R.id.imageView1); 
    //holder.img.setImageResource(imageId[position]); 


    ImageView img = (ImageView) convertView.findViewById(R.id.imageView1); 
    //Note you don't need the Holder 
    Bitmap imageBitmap = convertBitmap(imageId[position]); 
    if (imageBitmap != null) 
     img.setImageBitmap(imageBitmap); 
    else 
     img.setImageBitmap(null); 

    return convertView; 
} 

И, пожалуйста, посмотрите на вашего использования шаблона ViewHolder. Вы используете его неправильно ...

+0

Вы возвращаете rowView, но его не существует, что мне с ним делать? – DAVIDBALAS1

+0

@ DAVIDBALAS1Oh, мой ошибка. Посмотрите на отредактированный ответ. Вы должны использовать тот же convertView –

+0

Спасибо, в любом случае, к сожалению прокрутка по-прежнему немного лаги. – DAVIDBALAS1

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