因此,使用通常熟知的ViewHolder模式如下(ListAdapter):關於ListView中ViewHolder模式實現優化
...
@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);
...
反正它必須調用構造函數。這只是一個品味問題嗎?或者這個版本以某種方式變慢,或者以某種方式影響性能?
謝謝,這就是我正在考慮的方式。 – Stan