2013-04-18 4 views
0

У меня в моем коде два типа для реализации адаптера, и я не уверен, какой из них лучше.Реализация эффективного адаптера

Вот мой обновления картина:

public View getView(int position, View convertView, ViewGroup parent) { 
    Updater content; 
    if(convertView == null) { 
     final TextView msg = new TextView(parent.getContext()); 
     content = new Updater() { 
      public void update(...) { 
       // code to update the control msg 
      } 
     }; 
     convertView = msg; 
     convertView.setTag(content); 
    } else { 
     content = (Updater)convertView.getTag(); 
    } 
    content.update(...); 
    return convertView; 
} 

// ... 

private interface Updater { 
    void update(...); 
} 

А вот мой ViewHolder картина:

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if(convertView == null) { 
     convertView = inflater.inflate(...); 
     holder = new ViewHolder(convertView); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.setData(...); 
    return convertView; 
} 

// ... 

private class ViewHolder { 
    public final TextView text; 

    public ViewHolder(final View owner) { 
     text = (TextView)owner.findViewById(R.id.text); 
    } 

    public void setData(...) { 
     // ... 
    } 
} 

мне интересно, какой из них более effency? Я мог бы также реализовать интерфейс Updater в более сложном элементе управления, поэтому упрощается до обновление различных элементов управления обычным способом. Поэтому я мог просто передать convertView в свой интерфейс без использования getTag(). Но в приведенном выше коде я использую переменную final, которая определена вне моей реализации интерфейса. Может кто-нибудь сказать мне, может ли это сделать проблемы с производительностью? Я не знаю, что происходит внутри java с конечной переменной.

Если мой обновления картина плохо пожалуйста, скажите мне, почему я должен использовать ViewHolder шаблон кроме того, что эта модель от Google IO.

+2

Я не понимаю смысла иметь интерфейс для обновления, поскольку, по-видимому, у вас есть только одна реализация. поэтому разница, по-видимому, лежит исключительно в том месте, где вы добавляете реализацию update/setData, либо в анонимный класс в getView, либо в класс ViewHolder. Для меня это то же самое – njzk2

+0

Я хочу сказать, что я не уверен, следует ли использовать несколько конечных полей вне реализации интерфейса. Это неэффективно? Я не знаю, что последнее ключевое слово имеет в Java VM или Dalvik VM. Код обеих функций * update * почти равен. Я просто мог бы иметь несколько элементов, которые необходимо обновить. – rekire

ответ

0

Решения, подобные этому, практически не влияют на производительность. Оба решения одинаково эффективны. Конечная клавиатура может фактически повысить производительность, позволяя компилятору сделать определенные оптимизации, но они, безусловно, будут недоступны.

+0

Я хочу сказать, что когда моему адаптеру нужно обрабатывать несколько типов ('getViewTypeCount()'), и у меня есть 1000 элементов, и пользовательские прокрутки быстро перенаправляются в этот список, моему приложению нужно быстро выполнять обновления. Так что это важно. Но в целом вы правы. Я нашел [этот ответ] (http://stackoverflow.com/a/4732617/995926), который поддерживает ваше заявление о том, что нет никаких плохих последствий. – rekire

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