所以通常使用的ViewHolder模式如下(ListAdapter):
无论如何,它必须调用构造函数。这只是品味的问题吗?还是这个版本在某种程度上更慢,或者以某种方式影响性能?
...
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final Album album = albums.get(position);
ViewHolder viewHolder = null;
if (convertView==null){
convertView = inflater.inflate(R.layout.albums_list_item, null);
final ImageView albumImage = (ImageView) convertView.findViewById(R.id.album_icon);
final TextView txtTitle = (TextView) convertView.findViewById(R.id.album_title);
final TextView txtDescription = (TextView) convertView.findViewById(R.id.album_copyright);
viewHolder = new ViewHolder();
viewHolder.albumImage = albumImage;
viewHolder.txtTitle = txtTitle;
viewHolder.txtDescription = txtDescription;
convertView.setTag(viewHolder);
}
else
viewHolder = (ViewHolder)convertView.getTag();
viewHolder.txtTitle.setText(album.getTitle(locale));
viewHolder.txtDescription.setText(album.getCopyrightInfo(locale));
...
return convertView;
}
ViewHolder类通常看起来像这样:
static class ViewHolder{
public ImageView previewImage;
public TextView txtTitle;
public TextView txtDescription;
}
我的问题与ViewHolder实现有关。
1)为什么不使用构造函数而是初始化每个字段?
2)为什么要使用默认访问类型而不是受保护的(实际上应该是私有的,但这会影响由JIT创建的静态访问器的性能)?好吧,我猜只涉及继承。
那么为什么以下模式不更好(不包括“受保护 vs 默认”访问类型):
protected static class ViewHolder{
public final ImageView previewImage;
public final TextView txtTitle;
public final TextView txtDescription;
public ViewHolder (final ImageView previewImage, final TextView txtTitle, final TextView txtDescription){
this.previewImage = previewImage;
this.txtTitle = txtTitle;
this.txtDescription = txtDescription;
}
}
ListAdapter仅有的更改是:
...
final TextView txtDescription = (TextView) convertView.findViewById(R.id.album_copyright);
viewHolder = new ViewHolder(albumImage, txtTitle, txtDescription);
convertView.setTag(viewHolder);
...
无论如何,它必须调用构造函数。这只是品味的问题吗?还是这个版本在某种程度上更慢,或者以某种方式影响性能?