2014-05-19 64 views
1
private class CustomAdapter extends CursorAdapter { 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    if (view != null) { 

     String url = cursor.getString(CONTENT_URL_COLUMN); 
     ViewHolder viewHolder = (ViewHolder) view.getTag(); 
     final ImageView imageView = viewHolder.mImageViewIcon; 
     final TextView textView = viewHolder.mTextViewName; 

      Picasso.with(context).load(url).into(new Target() { 

       @Override 
       public void onBitmapLoaded(Bitmap arg0, LoadedFrom arg1) { 
        imageView.setImageBitmap(arg0); 
        imageView.setVisibility(View.VISIBLE); 
        textView.setVisibility(View.GONE); 
       } 

       @Override 
       public void onBitmapFailed(Drawable arg0) { 
        imageView.setVisibility(View.GONE); 
        textView.setVisibility(View.VISIBLE); 
       } 
      }); 
     } 
    } 
} 
} 

如果圖像的名單得到已經下載,然後在快速度的滾動列表,稱爲 onBitmapLoaded()方法,並從內存緩存加載圖像。但有時調用onBitmapFailed()。爲什麼?有時畢加索不會從內存中緩存加載圖像

+0

'畢加索p值=新Picasso.Builder(上下文).setCache(新LruCache(24000))建立();' –

+0

問題仍然存在。 –

+0

使用https://code.google.com/p/android-query/#Image_Loading –

回答

7

您的Target正在垃圾收集,因爲沒有任何東西持有對它的引用。當持有ImageViewTarget s時,Picasso使用WeakReference

但是,根本不需要使用Target。只需使用.into的回調,並直接通過ImageView即可。

Picasso.with(context).load(url).into(imageView, new Callback() { 
    @Override public void onSuccess() { 
    imageView.setVisibility(VISIBLE); 
    textView.setVisibility(GONE); 
    } 

    @Override public void onError() { 
    imageView.setVisibility(GONE); 
    textView.setVisibility(VISIBLE); 
    } 
}); 
+0

如果您想設置像LinearLayout一樣的GroupView背景,則Target是必需的。 – AndaluZ