ListView замедляется, когда вызывается метод Base adapter.getview()

Я отлаживал свое приложение и увидел, что при прокрутке списка вызывается метод getView() класса BaseAdapter для создания новых представлений.

public View getView(int position, View convertView, ViewGroup parent) {
    Article article = this.articles.get(position);
    return new MainView(this.context, articulo.getTitle() , articles.getDescription(),articles.getImgUrl());)  }

когда я прокручиваю listActivity, чтобы увидеть новые элементы, этот метод вызывается снова, чтобы создать приведенные ниже элементы представления списка, как следствие того, что элементы списка имеют изображения, ListActivity замедляется, есть ли способ создать все представления элементов один раз, и не создавать ListItems, когда мы прокручиваем listActivity


person cesar    schedule 14.09.2011    source источник


Ответы (3)


ListViews очень оптимизированы для производительности, вы должны использовать ViewHolder внутри вашего ListAdapter для кэширования ListItems.

проверьте http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

правило заключается в том, что сначала настройте свой пользовательский вид, упакуйте все в свой держатель и прикрепите этот держатель к представлению, во второй раз, когда представление используется, Android просто извлекает информацию о держателе (действительно быстро).

person Michele    schedule 14.09.2011

Вероятно, это замедляется из-за количества создаваемых объектов. Для производительности вы должны повторно использовать свои строки. См. реализацию getView здесь: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List4.html и http://developer.android.com/ресурсы/образцы/ApiDemos/src/com/example/android/apis/view/List14.html

person C0deAttack    schedule 14.09.2011

Вы не должны создавать новое представление при каждом вызове getView. ConvertView, который передается, позволяет повторно использовать существующий View. В вашем случае это будет экземпляр MainView. Итак, вы можете сделать что-то вроде этого:

MainView mv;
if (convertView != null){
  mv = (MainView) convertView;
  ((TextView) mv.findViewById(R.id.title)).setText(articulo.getTitle());
  // similar for description and imgUrl
} else {
  mv = new MainView(...);
}
return mv;

Кроме того, вы можете использовать шаблон ViewHolder, предложенный Микеле. Это позволит вам избежать поиска findViewById при настройке заголовка и т. д. Вот отличное объяснение ViewHolder.

person michaelg    schedule 14.09.2011