Vì vậy, các ViewHolder mẫu nổi tiếng sử dụng thường trông giống như (ListAdapter):Về ViewHolder thực hiện mô hình tối ưu hóa trong ListView
...
@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;
}
trong khi lớp ViewHolder thường trông giống như:
static class ViewHolder{
public ImageView previewImage;
public TextView txtTitle;
public TextView txtDescription;
}
Câu hỏi của tôi là về việc triển khai ViewHolder.
1) Tại sao nó không sử dụng một hàm tạo thay vì khởi tạo mọi trường đơn?
2) Tại sao nó sử dụng kiểu truy cập mặc định thay vì được bảo vệ (thực ra nó phải là riêng tư nhưng hiệu suất tác động này do các trình truy cập tĩnh được tạo bởi JIT)? Vâng, tôi đoán nó chỉ thừa kế thôi.
Vậy tại sao mô hình sau đây không phải là tốt hơn (không bao gồm "bảo vệ vs mặc định" loại truy cập):
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;
}
}
và sự thay đổi duy nhất ở ListAdapter là:
...
final TextView txtDescription = (TextView) convertView.findViewById(R.id.album_copyright);
viewHolder = new ViewHolder(albumImage, txtTitle, txtDescription);
convertView.setTag(viewHolder);
...
Dù sao nó phải gọi một constructor. Nó chỉ là vấn đề của hương vị? Hoặc là phiên bản này chậm hơn bằng cách nào đó hoặc nó có tác động đến hiệu suất theo một cách nào đó không?
Cảm ơn, đó chỉ là cách tôi đang nghĩ về nó. – Stan