2012-05-14 3 views
1

Как я могу улучшить производительность gridView? Прокрутка не является гладкой.Как улучшить производительность gridview (android)

Вот мой код:

public View getView(final int position, View convertView, ViewGroup parent) { 

     View MyView; 

     // Inflate the layout 
     LayoutInflater li = ((Activity) MyContext).getLayoutInflater(); 

     MyView = li.inflate(R.layout.gallery_adapter, null); 
     ImageButton imageFolders = (ImageButton) MyView.findViewById(R.id.folder); 


     try { 

      imageFolders.setImageBitmap(bMap); 
      imageFolders.setOnClickListener(this); 
      imageFolders.setId(products.get(position).getId()); 
     } catch (Exception e) { 

     } 

     MyView.setLayoutParams(70, 70); 
     return MyView; 
    } 

У меня есть что-то вроде 200 изображений на этом GridView, но производительность очень, очень плохо.

+3

Recycle your views –

+2

Что сказал @ K-ballo. Кроме того, вам не нужна попытка/уловка для установки значений на вашем изображении. И вы должны перенести свой инфразводитель макета на конструктор вашего адаптера, поэтому вам нужно получить его один раз вместо каждого представления. 1 раз против 200. – dymmeh

+0

Спасибо за помощь. У меня проблема, когда я пытаюсь переработать свои взгляды. Некоторые изображения дублируются. Какие-нибудь советы? – hdoria

ответ

3

вы можете изменить свой код так:

public View getView(final int position, View convertView, ViewGroup parent) { 

    View MyView; 

    if(convertView==null) 
    { 
     // Inflate the layout 
     LayoutInflater li = ((Activity) MyContext).getLayoutInflater(); 

     MyView = li.inflate(R.layout.gallery_adapter, null); 
     ImageButton imageFolders = (ImageButton) MyView.findViewById(R.id.folder); 


     try { 

      imageFolders.setImageBitmap(bMap); 
      imageFolders.setOnClickListener(this); 
      imageFolders.setId(products.get(position).getId()); 
     } catch (Exception e) { 

     } 

     MyView.setLayoutParams(70, 70); 
    } 
    else 
     MyView = convertView; 
    return MyView; 
} 

изображения уже загружены не будет перезагружен. вы пробовали эту возможность?

+0

Работал лучше, но у меня возникла проблема с этим кодом. Изображения дублируются. Похоже, что изображения заменяются при прокрутке gridView. Все изображения должны быть разными. Что не так? – hdoria

+0

Вы внедрили эту функцию: «public int getItemPosition (объект объекта)» –

+1

вы должны прочитать это: [viewpager-pageradapter] (http://stackoverflow.com/questions/7263291/viewpager-pageradapter-not-updating-the -view) –

-3

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

+2

Более быстрый телефон не является решением этой проблемы. Исправьте проблему, а не обходите ее. Кроме того, GridView вызывает callView непосредственно перед просмотром представлений на экране. Для этого условия нет никаких оснований. – dymmeh

+0

быстрее телефон? Тогда как стать разработчиком. –

0
public View getView(final int position, View convertView, ViewGroup parent){ 

    View MyView; 
    ImageButton imageFolders; 

    if(convertView==null){ 
     LayoutInflater li = ((Activity) MyContext).getLayoutInflater(); 
     MyView = li.inflate(R.layout.gallery_adapter, null); 
    }else{ 
     MyView = convertView; 
    } 

    imageFolders = (ImageButton) MyView.findViewById(R.id.folder); 

    try { 
     imageFolders.setImageBitmap(bMap); 
     imageFolders.setOnClickListener(this); 
     imageFolders.setId(products.get(position).getId()); 
    } catch (Exception e) {} 

    MyView.setLayoutParams(70, 70); 
    return MyView; 
} 

я не испытал его, но дать ему попробовать

+0

im not sure об этой части: MyView.setLayoutParams (70, 70); Если это вызвало проблему, попробуйте поместить ее в блок if/else после MyView = ... –

0

делать все изменения макета, как textView.setText("text"); внутри if(convertView == null) улучшена производительность чрезвычайно для меня.

Также, если вам нужно позвонить super.getView();, позвоните ему сразу после if(convertView == null) Блок.

Для else часть return convertView.

0
  1. Recycle your Views. Надуйте макет и задайте параметры макета только один раз.
  2. Убедитесь, что вы не загружаете Bitmap с диска/сети в основной поток.
  3. Упростите иерархию представлений в макете элементов сетки (R.layout.gallery_adapter).
  4. Убедитесь, что аппаратное ускорение не отключено в манифесте вашего приложения.
  5. Удостоверьтесь, что у вас нет овердрафта (рисунок нескольких фонов друг на друга).
Смежные вопросы