1

私は非常に苛立たしい問題を抱えており、何が悪いのかわかりません。GridView のみを含む単純な XML を作成します。このグリッドビューには、コードで取得した特定の URL からダウンロードした画像 (ImageView) が表示されます。

したがって、このアプリのアイデアは、URL から画像をダウンロードし、それらの画像を GridView に表示することだけです。まず、Universal Image Loader ライブラリを使用していると言わなければなりません。まず、私の getView コードを見てください:

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

        ImageView iv;

        if(convertView == null) {

        iv = new ImageView(MyActivity.this);
        iv.setLayoutParams(new GridView.LayoutParams(size,size));
        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
        Log.d("APP", "convertView is NULL");

        } 

        else {

        iv = (ImageView) convertView;
        Log.d("APP", "convertView is NOT null");

        }

        loader.displayImage(URLS.get(position), iv);

        return iv;

    }

問題:

上記のコードは機能し、GridView に画像を表示します。しかし、下にスクロールすると、次のように表示されます。

  1. すべての画像がダウンロードされました (表示されていない画像も含む)
  2. 上にスクロールすると、場所0にあった画像が場所1にあり、再度ダウンロードされていることがわかります。下にスクロールすると、画像の位置が再び変わりました。上にスクロールすると、画像が再び場所を切り替えていることがわかります(そして再びダウンロードしています)。これは無限に進みます。

この問題の解決方法:

  1. convertView 変数が null かどうかをチェックしないことで、この問題を解決しました。実はif/else節を省略しています。

  2. 私はメモリ内のキャッシュを使用しました= true。そのため、ダウンロードが停止し、画像が永久に残ります。

では、なぜ私は助けを求めているのですか?主な理由は、パフォーマンス上の理由から if/else 句を省略してはならないことを知っているからです。ユーザーのメモリを台無しにしたくないので、高速で信頼性の高いユーザー エクスペリエンスを提供したいと考えています。また、何が間違っているのか知りたいです。

ご協力ありがとう御座います。とても感謝しています。

4

3 に答える 3

0

GridView は、パフォーマンスのためにリスト アイテムをリサイクルします。そのため、スクロールすると、リスト項目が別の場所でリサイクルされ、コードが再入力されます。時々、これは画像に遅れます。

Picassoのようなこの種のものを処理するライブラリを使用することをお勧めします。

于 2013-08-24T18:12:26.923 に答える