ViewHolder
が同じモデルオブジェクトを使用しているかどうかを確認するのが適切な最適化であることを知りたいです。View
これは、によって返されたデータを入力するのに費用がかかる場合に使用しgetView()
ます。
これは、ビューのコンテンツが変更されないことを前提としています。これは一般的なケースだと思います。
たとえば、標準パターンは次のとおりです。
public View getView(int position, View convertView, ViewGroup parent) {
Model model = models.get(position);
if (convertView != null) {
// View was recycled. Get the holder.
viewHolder = (ViewHolder) convertView.getTag();
} else {
// Inflate a new layout and create a holder
convertView = inflater.inflate(R.layout.item_layout, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
viewHolder.img = (ImageView) convertView
.findViewById(R.id.img);
convertView.setTag(viewHolder);
}
// Fill in the content
Bitmap imgBitmap = loadBitmapFor(model.getName());
if (imgBitmap != null) {
viewHolder.img.setVisibility(View.VISIBLE);
viewHolder.img.setScaleType(ImageView.ScaleType.FIT_XY);
viewHolder.img.setImageBitmap(imgBitmap);
}
viewHolder.name.setText(model.getName());
return convertView;
}
static class ViewHolder {
TextView name;
ImageView img;
}
ListView
が同じオブジェクトを同じ位置で見ているかどうかを確認することで最適化します。
public View getView(int position, View convertView, ViewGroup parent) {
Model model = models.get(position);
boolean recycled;
if (convertView != null) {
// View was recycled. Get the holder.
viewHolder = (ViewHolder) convertView.getTag();
recycled = true;
} else {
// Inflate a new layout and create a holder
convertView = inflater.inflate(R.layout.item_layout, null);
viewHolder = new ViewHolder();
viewHolder.model = model;
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
viewHolder.img = (ImageView) convertView
.findViewById(R.id.img);
convertView.setTag(viewHolder);
recycled = false;
}
// Skip the expensive content loading if we can
if (recycled && (model == viewHolder.model) && (position == viewHolder.position)) {
return convertView;
}
// Fill in the content
Bitmap imgBitmap = loadBitmapFor(model.getName());
if (imgBitmap != null) {
viewHolder.img.setVisibility(View.VISIBLE);
viewHolder.img.setScaleType(ImageView.ScaleType.FIT_XY);
viewHolder.img.setImageBitmap(imgBitmap);
}
viewHolder.name.setText(model.getName());
return convertView;
}
static class ViewHolder {
int position; // for double checking_
Model model;
TextView name;
ImageView img;
}