0

サムネイル付きのニュース記事があるAndroidアプリケーションを作成しています。これらのサムネイルはネットワークからロードされ、URL をキー、ビットマップを値として LruCache に保存されます。

private LruCache<String, Bitmap> tCache;

アダプタの getView() メソッドで getThumbnail() を呼び出し、キャッシュをチェックし (必要に応じてネットワークからロード)、サムネイルを表示します。

public void populateList(){
    ...
    new Thread(new Runnable() {
        @Override
        public void run() {
            getThumbnail(story, thumbnail);
        }
    }).start();
}

private Bitmap getThumbnail(Story story, ImageView imageView) {
    String url = story.getThumbnail();

    Bitmap bitmap;
    synchronized (tCache) {
        bitmap = tCache.get(url);

        if (bitmap == null) {

            bitmap = new ImageLoadingUtils(this, imageView).execute(url,
                    Boolean.TRUE).get();
            tCache.put(url, bitmap);

        }
    }
    return bitmap;

}

ImageLoadingUtils はネットワークからロードし、完了したら結果のビットマップを ImageView に配置します。

@Override
protected void onPostExecute(Bitmap result) {
    if (imageView != null) {
        imageView.setImageBitmap(result);
        adapter.notifyDataSetChanged();
    }
}

問題は、下にスクロールすると同じ ListView でサムネイルが繰り返されることです。

________
|画像1|
|画像2|
|画像3| 画面
|画像4|
--------
|画像1|
|画像2| オフスクリーン
________

また、下にスクロールしてから上に戻ると、記事に正しいサムネイルが表示されなくなりました。とてもめちゃくちゃです。

誰でも問題を見つけることができますか? 本当にありがとうございました。

4

2 に答える 2

2

問題は、ビューがリストビューで再利用されるためです。リストビューでサムネイルを非同期的にキャッシュおよびロードする方法の良い例を次に示します。

遅延読み込み ListView Android

于 2012-12-30T15:49:47.873 に答える
0

アダプターの getView メソッドに次のような行が含まれている場合:

@Override
public View getView(int position, View convertView, ViewGroup parent) {     
   if(convertView == null){
       LayoutInflater inflater = (LayoutInflater) context.getSystemService(...);
       convertView = inflater.inflate(...);
   }
}

この「if」条件を削除し、次のような内部コードのみを保持します。

@Override
public View getView(int position, View convertView, ViewGroup parent) {    
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(...);
    convertView = inflater.inflate(...);
}
于 2016-02-22T18:11:56.757 に答える