Динамически рисовать изображения в GridView - PullRequest
0 голосов
/ 18 января 2012

У меня есть этот класс, который рисует изображения в GridView:

    public class ImageAdapter extends BaseAdapter
{
   Context MyContext;
   Vector<User> users;
   int level;


   public ImageAdapter(Context _MyContext, Vector<User> _users, int _level)
   {
      MyContext = _MyContext;
      users = _users;
      level = _level;
   }

   @Override
   public int getCount() 
   {
                     /* Set the number of element we want on the grid */
       if(users==null)
           return 0;
      return users.size();
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) 
   {
      View MyView = convertView;            
                             /*we define the view that will display on the grid*/
         //Inflate the layout
         LayoutInflater li = getLayoutInflater();
         MyView = li.inflate(R.layout.grid_item, null);

         // Add The Text!!!
         TextView tv = (TextView)MyView.findViewById(R.id.grid_item_text);

         // Add The Image!!!           
         ImageView iv = (ImageView)MyView.findViewById(R.id.grid_item_image);
         iv.setBackgroundResource(R.drawable.button_restricted);
         iv.setImageResource(R.drawable.defaultperson02);
         byte[] bytes;
         if(position<users.size()){
             final User user =users.get(position);
            tv.setText(users.get(position).getDisplay_name());  
            bytes = user.getAvatar();
            if(bytes!=null && bytes.length>0 ){
                try{
                    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                    iv.setImageBitmap(bitmap);
                }catch(Exception e){                        

                }
            }

         }

      return MyView;
   }

    @Override
    public Object getItem(int arg0) {
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        return 0;
    }
}

Этот класс обычно работает отлично, но иногда я получаю это исключение:

01-18 12:39:26.160: ERROR/AndroidRuntime(30496): FATAL EXCEPTION: main
01-18 12:39:26.160: ERROR/AndroidRuntime(30496): java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=15303KB, Allocated=10747KB, Bitmap Size=18391KB)
01-18 12:39:26.160: ERROR/AndroidRuntime(30496):     at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
01-18 12:39:26.160: ERROR/AndroidRuntime(30496):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:625)
01-18 12:39:26.160: ERROR/AndroidRuntime(30496):     at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:638)

Я попытался переработать растровое изображение, но ошибка все еще появляется.

Ты хоть представляешь, почему у меня такая проблема?

1 Ответ

0 голосов
/ 18 января 2012

вы должны повторно использовать класс convertview. В приведенном выше коде вы создаете новое представление каждый раз, когда вызывается getView. Это не правильный способ делать вещи. Вместо этого проверьте, является ли convertview нулевым или нет. Если это значение равно null, то надуйте представление, иначе используйте конвертируемое представление. Для более подробной информации проверьте это .

...