1

まず第一に、はい、私はこの質問を知っていますが、答えは役に立ちません。はい、「スクロール時に位置が変わる」問題は解決しますが、私の問題に対する最適な解決策ではありません。説明させてください...

だから、これは私のgetViewです:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    UnscaledImageView imageView;

    if(convertView == null) {
        imageView = new UnscaledImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(mIconSize, mIconSize));
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        imageView.setImageResource(mThumbIds[position]);
    } else {
        imageView = (UnscaledImageView)convertView;
    }

    return imageView;
}

そして、一般的な解決策は、ステートメントimageView.setImageResource(mThumbIds[position]);の外側と下に移動することです。ifしかし、これは別の問題を引き起こします...

お気づきかもしれませんが、私は のUnscaledImageView代わりに を使用していImageViewます。これは、必要に応じていくつかの追加オプションを使用してビットマップを手動でデコードするメソッドをImageViewオーバーライドした場所のカスタム サブクラスです。setImageResource()手動デコードが問題の原因です。

setImageResource()メソッドが 内にとどまる場合、if問題ありません。ビットマップのデコードはビットマップに対して 1 回行われ (GridView の読み込み中)、スクロールはスムーズになります。しかし、画像はスクロールごとに異なる位置にジャンプします。

ただし、setImageResource()メソッドが の外にあるif場合、画像は別の位置にジャンプしませんが、すべての画像はスクロールごとに常にデコードされます。スクロールはぎこちなく、まったくスムーズではありません。

この問題を解決するにはどうすればよいですか? 何か案は?

4

1 に答える 1

1

おそらく、デコードされた画像に何らかのバッファリングまたはキャッシュを使用できます。メソッドsetImageResourceは、その入力画像が既にバッファにあるかどうか (つまり、すでにデコードされているかどうか) をチェックする必要があります。その場合、メソッドはバッファからデコードされた画像を取得するだけです。そうでない場合は、画像をデコードし、将来の使用のためにバッファに保存します。バッファ/キャッシュの実装方法は、必要に応じて異なります。たくさんの可能性があると確信しています。setImageResourceこのようにして、の呼び出しをブロックの外に移動でき、メソッドが呼び出されるif-thenたびに画像をデコードする必要がなくなります。getView

于 2012-08-27T21:06:44.583 に答える