2009-10-04 64 views
1

我一直在尋找是否有一個標準的方式來實現這一點,但我每次都找到不同的解決方案。Android:如何使用ImageView + 3 TextViews優化ListView?

基本上,我試圖建立一個Custom ListView與圖像和除此之外的兩三行文字。

爲了優化它,我理解,下面的已被使用:

  1. convertView:基本上,如果有人已經充氣時,使用它

  2. Lazy-Loading:不要加載直到他們被要求的行的內容

  3. 背景Downloading & Caching:下載圖像在他們自己的線程,然後更新行(並可能緩存它們?)

我可以管理1和2,但第三個是真的讓我困惑。

對此有最佳做法嗎?

感謝

回答

2

感謝馬克的幫助。這是在做什麼,他建議的一種方式(以防萬一一些其他好奇):

private class DownloadImageTask extends AsyncTask<Object, Integer, Bitmap> { 

      private ImageView iv; 

      protected Bitmap doInBackground(Object... params) { 
       try { 
        iv = (ImageView) params[0]; 
        URL aURL = new URL("http://URLTOIMAGE/img" + params[1] + ".png"); 
        URLConnection conn = aURL.openConnection(); 
        conn.connect(); 
        InputStream is = conn.getInputStream(); 
        BufferedInputStream bis = new BufferedInputStream(is); 
        Bitmap bm = BitmapFactory.decodeStream(bis); 
        bis.close(); 
        is.close(); 
        return bm; 
       } catch (IOException e) { 
        return null; 
       } 
      } 

      protected void onPostExecute(Bitmap result) { 
       iv.setImageBitmap((Bitmap) result); 
      } 
     } 

而且,它還將可用於如下:

new DownloadImageTask().execute(new Object[] {ImageViewHandle, position}); 

請注意,這不是一個工作代碼。這是從一個更大的代碼庫中取得的,所以你將不得不作出適當的修改來完成這項工作。

0

它可能是早了一點用來形容一些作爲「最佳實踐」。 AsyncTask或監視LinkedBlockingQueue的線程是卸載類似圖像抓取的好方法。

您可能會對我的ThumbnailAdapter感興趣,它會爲您處理後臺下載和緩存。

+0

一如既往,感謝您的簡單答案。感謝您將我指向ThumbnailAdapter。我對你原來的AdapterWrapper類不太瞭解,所以在跳進這段代碼之前,我會先通讀一下。出於好奇,如果我使用更新ImageView的AsynTask?線程是否獲得了ImageView的句柄,還是返回了我用來更新的Bitmap? 謝謝 – Legend 2009-10-04 21:34:31

+0

AsyncTask#onPostExecute()在UI線程上運行。它可以傳遞你下載的結果(來自AsyncTask#doInBackground()),它可以更新適當的ImageView。 – CommonsWare 2009-10-04 22:27:28

+0

太棒了!非常感謝您的意見。我現在將實現一個簡單的緩存機制。 (您的縮略圖適配器非常有用!謝謝!)。順便說一句,我剛剛得到了你建議的AsynTask appraoch的工作。我將發佈它作爲對這篇文章的迴應。 – Legend 2009-10-04 22:40:20