2014-01-29 3 views
2

У меня есть список, в котором я должен загружать разные объекты с текстом и стандартным образом, но в arraylist, который я даю списку, есть некоторые объекты, которые должны быть загружены с помощью другого " row.xml». Я не знаю, если я объяснил, вероятно, код уточнит все:лаг во время прокрутки в андроиде listview

это мой адаптер

/** 
* 
*/ 


import java.util.List; 

import com.larvalabs.svgandroid.SVG; 
import com.larvalabs.svgandroid.SVGParser; 



import android.content.Context; 
import android.graphics.Typeface; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class EventAdapter extends ArrayAdapter<EventEntry> { 

    Typeface face; 
    private static final Integer LIST_HEADER = 0; 
    private static final Integer LIST_ITEM = 2; 

    public EventAdapter(Context context, int textViewResourceId, List<EventEntry> objects) { 
     super(context, textViewResourceId, objects); 
     face=Typeface.createFromAsset(context.getAssets(),"fonts/arial.ttf"); 

    } 



    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return getViewOptimize(position, convertView, parent); 
    } 

    public View getViewOptimize(int position, View convertView, ViewGroup parent) { 

     //piece of code for header items 
     String headerText = getHeader(position); 
     if(headerText != null) { 

      View item = convertView; 
      if(convertView == null || convertView.getTag() != LIST_HEADER) { 

       item = LayoutInflater.from(getContext()).inflate(
         R.layout.event_list_header, parent, false); 
       item.setTag(LIST_HEADER); 

      } 

      TextView headerTextView = (TextView)item.findViewById(R.id.lv_list_hdr); 
      headerTextView.setText(headerText); 
      return item; 
     } 



     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.row_event, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.first = (TextView)convertView.findViewById(R.id.ev_tit_list); 
      viewHolder.second = (ImageView)convertView.findViewById(R.id.ev_image_list); 
      convertView.setTag(viewHolder); 
     } else { 
      try{ 
       viewHolder = (ViewHolder) convertView.getTag(); 
      }catch(ClassCastException e){ 
       LayoutInflater inflater = (LayoutInflater) getContext() 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.row_event, null); 
       viewHolder = new ViewHolder(); 
       viewHolder.first = (TextView)convertView.findViewById(R.id.ev_tit_list); 
       viewHolder.second = (ImageView)convertView.findViewById(R.id.ev_image_list); 
       convertView.setTag(viewHolder); 
      } 
     } 
     EventEntry e = getItem(position); 
     if (e.getEvento()!=null) 
      return setEventItem(viewHolder, e.getEvento(), convertView); 
     else 
      return setSagraItem(viewHolder, e.getSagra(), convertView); 


    } 

    public View setEventItem(ViewHolder viewHolder, Entry2ev e, View convertView){ 

     viewHolder.first.setTypeface(face, Typeface.BOLD); 
     viewHolder.first.setText(e.getTit()); 
     viewHolder.second.setImageResource(e.getIm()); 

     SVG svg_event = SVGParser.getSVGFromResource(getContext().getResources(), R.raw.eventi_principale); 
     viewHolder.second.setImageDrawable(svg_event.createPictureDrawable()); 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { 

      viewHolder.second.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

     } 
     return convertView; 
    } 

    public View setSagraItem(ViewHolder viewHolder, EntrySagreEvent e, View convertView){ 

     viewHolder.first.setText(e.getName()); 
     viewHolder.first.setTypeface(face, Typeface.BOLD); 

     viewHolder.second.setImageResource(R.drawable.shop); 

     return convertView; 
    } 

     private String getHeader(int position) { 

      if(getItem(position).getMonth()!=null) { 
       return getItem(position).getMonth(); 
      } 
      else 
       return null; 
     } 


    private class ViewHolder { 
     public TextView first; 
     public ImageView second; 
    } 
} 

что я могу сделать, чтобы получить лаг свободной прокрутки? Большое спасибо

+1

Как правило, если вы хотите показать несколько «типов» в представлении строк, вы должны реализовать 'getItemViewType' и' getViewTypeCount', а затем переключить возвращаемое значение 'getItemViewType' внутри' getView'. На самом деле я не уверен, что здесь многое сделаю, похоже, вы используете один и тот же ресурс компоновки в обоих случаях. Что мне ** выделяется для меня, это 'SVGParser.getSVGFromResource (...)'. Насколько дорогой звонок? Вам нужно разобрать этот ресурс при каждом вызове 'getView', или вы можете сделать это один раз во время построения и кэшировать результат? – Karakuri

+0

Большое спасибо за советы! Я посмотрю на getItemViewType, чтобы узнать, есть ли что-то лучше в моем коде; Я полностью забыл о вызове SVGParser! Я удалил его для тестирования, это не нужно! – gauss

ответ

2

Вы хотите сослаться на эту статью Google: http://developer.android.com/training/improving-layouts/smooth-scrolling.html

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

+0

Спасибо, но у меня alrealdy используется шаблон Holder – gauss

0

Не инициализируйте Typephase в пользовательском адаптере, а не передайте его как аргумент предыдущего класса. Проблема решена для меня так же.

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