2012-10-10 65 views
5

我有這個getView適配器:getView被稱爲多次爲第一位置的GridView

public View getView(int position, View convertView, ViewGroup parent) { 
    Log.d("getView gv", position+""); 

    NewsLine holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.grid_entry, parent, false); 
     holder = new NewsLine(); 

     holder.iv= (ImageView) convertView.findViewById(R.id.photo); 

     convertView.setTag(holder); 
    } else { 
     holder = (NewsLine) convertView.getTag(); 
    } 

    NewsItem item=news.ITEMS.get(position); 
    //--------- 

    if(item.imgurl!=null && item.imgurl.compareToIgnoreCase("null")!=0) 
    { 
     holder.iv.setVisibility(View.VISIBLE);  
     mMemoryCache.loadBitmap(item.imgurl, holder.iv,position); 
    } 
    else 
     holder.iv.setVisibility(View.INVISIBLE); 
    //------------- 




    return convertView; 
} 

我有兩個問題:

  1. 的getView被稱爲幾次位置0 (如果在LruCache中遺漏了位圖,則使用AsyncTask下載位圖)。我有一個動畫(從0-1的alpha)重新啓動幾次該位置。

  2. 因爲我正在回收視圖,有時您可以在幾分之一秒內看到舊的imageView內容。

// ----

這裏是緩存類(僅限堆):

public class SetImgAT extends LruCache<String, Bitmap> { 
private static SetImgAT instance; 
private Animation FadeInAnimation; 

private SetImgAT(int size, Context context) { 
    super(size); 
    FadeInAnimation = AnimationUtils.loadAnimation(context, R.anim.fadein); 
} 

public static synchronized SetImgAT getInstance(int size, Context context) { 
    if (instance == null) { 
     instance = new SetImgAT(size, context); 
    } 
    return instance; 
} 

@Override 
protected int sizeOf(String key, Bitmap value) { 
    return (value.getRowBytes() * value.getHeight()); 
} 

public void loadBitmap(String url, ImageView imageView,int pos) { 
    Bitmap bitmap = instance.get(url.hashCode() + ""); 
    if (bitmap != null) { 
     Log.d("ImageCache", "hit - "+url.hashCode()+"pos:"+pos); 
     imageView.setImageBitmap(bitmap); 

     imageView.invalidate(); 
    } else { 
     Log.d("ImageCache", "miss"); 
     BitmapWorkerTask task = new BitmapWorkerTask(imageView); 
     task.execute(url); 
    } 
} 

class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView mImageView; 

    public BitmapWorkerTask(ImageView imageView) { 
     mImageView = imageView; 
    } 

    @Override 
    protected Bitmap doInBackground(String... url) { 
     Bitmap Picture = null; 


     if (url[0] != null && url[0].compareToIgnoreCase("null") != 0) { 
      Log.d("GetBMP from", url[0]); 

      URL img_value = null; 
      try { 
       img_value = new URL(url[0]); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      try { 
       Picture = BitmapFactory.decodeStream(img_value 
         .openConnection().getInputStream()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if (Picture == null) { 
       Log.d("deb", "no bitmap"); 
      } else { 
       Log.d("got deb", "got bitmap to "+url[0].hashCode());     
       instance.put(url[0].hashCode()+"", Picture); 
      } 

     } 
     return Picture; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     // super.onPostExecute(result); 
     if (result != null) { 
      Log.d("deb", "set bitmap"); 
      mImageView.setImageBitmap(result); 
      //mImageView.startAnimation(FadeInAnimation); 
     } 

    } 
} 

// ------------- ---

}

謝謝! :)

+0

對於問題2,嘗試調用'mMemoryCache.loadBitmap()''之前setVisibility()'防止舊圖像出現。 – Sam

+2

「getView被調用多次位置0」 - 這是完全正常的行爲。沒有規定多少次getView()會被調用。總的來說,StackOverflow是針對編程問題的,並且您沒有提出任何問題。 – CommonsWare

+0

山姆它沒有工作,似乎有更多的照顧,我要通過http://developer.android.com/training/displaying-bitmaps/cache-bitmap緩存位圖的樣本。 html。在CommonsWare謝謝你,我不認爲我需要把這個改爲一個問題,也許你可以試試。 – Misca

回答

0

我看到類似的行爲時來回滾動或隨意調用notifyDataSetChanged()。

作爲對你現在在做什麼的增強,我建議使用畢加索,因爲它處理這種情況的效果非常好,除了淡入動畫。

在getView()A一個襯墊:

Picasso.with(context).load(urlToLoad).into(imageView); 

參見: http://square.github.io/picasso/