У меня в моем коде два типа для реализации адаптера, и я не уверен, какой из них лучше.Реализация эффективного адаптера
Вот мой обновления картина:
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.
Я не понимаю смысла иметь интерфейс для обновления, поскольку, по-видимому, у вас есть только одна реализация. поэтому разница, по-видимому, лежит исключительно в том месте, где вы добавляете реализацию update/setData, либо в анонимный класс в getView, либо в класс ViewHolder. Для меня это то же самое – njzk2
Я хочу сказать, что я не уверен, следует ли использовать несколько конечных полей вне реализации интерфейса. Это неэффективно? Я не знаю, что последнее ключевое слово имеет в Java VM или Dalvik VM. Код обеих функций * update * почти равен. Я просто мог бы иметь несколько элементов, которые необходимо обновить. – rekire