0

私のコードには Adapter 実装用に 2 つのタイプがありますが、どちらが優れているかわかりません。

ここに私のアップデータパターンがあります:

public View getView(int position, View convertView, ViewGroup parent) {
    Updater content;
    if(convertView == null) {
        final TextView msg = new TextView(parent.getContext());
        content = new Updater() {
            public void update(...) {
                // code to update the control msg
            }
        };
        convertView = msg;
        convertView.setTag(content);
    } else {
        content = (Updater)convertView.getTag();
    }
    content.update(...);
    return convertView;
}

// ...

private interface Updater {
    void update(...);
}

そして、ここに私のViewHolderパターンがあります:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView == null) {
        convertView = inflater.inflate(...);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    holder.setData(...);
    return convertView;
}

// ...

private class ViewHolder {
    public final TextView text;

    public ViewHolder(final View owner) {
        text = (TextView)owner.findViewById(R.id.text);
    }

    public void setData(...) {
        // ...
    }
}

どちらがより効率的か疑問に思っていますか?Updaterインターフェイスをより複雑なコントロールに実装することもできるので、異なるコントロールを共通の方法で更新する方が簡単です。convertViewそのため、 を使用せずに をインターフェースにキャストすることができましたgetTag()。しかし、上記のコードfinalでは、インターフェイスの実装の外部で定義された変数を使用しています。これがパフォーマンスの問題を引き起こす可能性があるかどうか誰かに教えてもらえますか? 最終変数を使用してJavaの内部で何が起こるかわかりません。

アップデーターパターンが悪い場合は、 ViewHolderパターンを使用する必要がある理由を教えてください。ただし、このパターンは Google IO からのものです。

4

1 に答える 1

0

このような決定は、パフォーマンスにほとんど影響を与えません。どちらのソリューションも同等に効率的です。最終的なキーボードは、コンパイラが特定の最適化を行うことを可能にすることで、実際にはパフォーマンスを向上させるかもしれませんが、それらは確かに目立たないでしょう.

于 2013-04-19T05:29:36.540 に答える