したがって、通常使用するよく知られた 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);
...
とにかく、コンストラクターを呼び出す必要があります。それは単に好みの問題ですか?それとも、このバージョンは何らかの理由で遅くなったり、何らかの形でパフォーマンスに影響を与えたりしますか?