2013-04-08 2 views
0

До сих пор я видел несколько примеров приложений, которые используют BaseAdapter и ArrayAdapter<?>. но я до сих пор не совсем ясно, почему так должно быть.Соответствующее использование Класс BaseAdapter специально метод getView

Первый пример простирается от ArrayAdapter<?>, этот пример используется в ListView, следующий метод GetView

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

    View row = convertView; 
    Holder holder = null; 

    // Holder represents the elements of the view to use 
    // Here are initialized 
    if(null == row) {    
     row = LayoutInflater.from(mContext).inflate(LAYOUT_ITEM_ID, parent, false);     

     holder = new Holder(); 
     holder.titleTextView = (TextView)row.findViewById(android.R.id.title);    

     row.setTag(holder); 
    } else { 
     holder = (Holder) row.getTag(); 
    }  

    // here do operations in holder variable example 
    holder.titleTextView.setText("Title " + position); 

    return row; 
} 

public static class Holder {   
    TextView titleTextView;  
} 

Теперь во втором примере найденное используется BaseAdapter на GridView это метод GetView

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 

    return imageView; 
} 

Мой вопрос: для правильного использования адаптера необходимо использовать «держатель» статический класс, какие последствия это имеет на производительность приложений и совместимости на нескольких устройствах (мин AP I 8).

ответ

3

Нет необходимости использовать класс держателя; более важно убедиться, что вы когда-нибудь используете конвертер, поскольку это заметно улучшает скорость. При этом использование держателя обеспечивает даже лучшую производительность, особенно если вы показываете множество элементов, так как getView не будет раздувать xml каждый раз.

Это видео объясняет это более подробно: http://www.youtube.com/watch?v=wDBM6wVEO70

+0

Это относится к GridView? – rkmax

+0

Да, да. На самом деле они даже говорят в этом видео, что GridView и ListView почти идентичны – Nek

1

Во-первых, я хотел бы указать вам на World of ListView session, который проходил во время Google I/O '10. Стоит посмотреть эту презентацию (или прочитать через pdf), чтобы лучше понять механику ListView и почему шаблон «ViewHolder/RowWrapper» может значительно ускорить работу.

Есть в основном два ключевых ингредиентов для оптимизации getView() логики: использование

  • сделать из переработанного вида (convertView параметров, которые получают передаваемые в getView())
  • Минимизировать количество (дорогие) findViewById() вызовов

В вашем первом примере шаблон ViewHolder применяется только для раздувания представления строки, если нет переработанного представления - это хорошо. Во-вторых, это уменьшает количество поисковых запросов, помещая строку с объектом ViewHolder, который действует как обертка для TextView, который уже был получен ранее.

Ваш второй пример не раздувает представление строки, а скорее создает его во время выполнения. Он по-прежнему проверяет, доступно ли переработанное представление и использует ли это, если это возможно - опять-таки, это хорошо. Кроме того, поскольку вид строки (или вид сетки в этом случае) представляет собой только один ImageView, convertView может быть простым в отливке до ImageView. Обратите внимание, что если вид строки/сетки состоял бы из больше, чем просто один вид, подход ViewHolder из первого фрагмента был бы подходящим способом.

С учетом того, что представление строки в первом фрагменте также представляет собой всего лишь один TextView, его можно было бы упростить, используя тот же подход, что и во втором фрагменте. Довольно часто представления строк состоят из нескольких представлений, поэтому я предлагаю всегда использовать шаблон ViewHolder, так как это даст вам максимальную гибкость для учета будущих изменений.

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