0

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;                
}
4

1 に答える 1

1

ビューのリサイクルは主に次のように機能するため:http://android.amberfog.com/wp-content/uploads/2010/02/listview_recycler.jpg

再利用されたビューの新しい位置と以前の位置が同じである可能性は低いです。

代わりに、のキャッシュに焦点を当てる必要がありますBitmapBitmapオンデマンドでsを生成し、それらをキャッシュに配置します。LruCacheここに示すように(互換性ライブラリで利用可能)を使用できます:http: //developer.android.com/training/displaying-bitmaps/cache-bitmap.html

于 2012-06-21T15:08:35.910 に答える