2011-07-07 84 views
0

我有一個ListActivity,它啓動一個任務來打一個Web服務並在一個ListView中顯示結果。每個結果都附有圖像ID。ListView中的圖像搜索結果

我寫了一個方法,它將屏幕上顯示的行的圖像ID(firstVisiblePosition()轉換爲lastVisiblePosition()),並啓動一個任務來查詢另一個Web服務以獲取這些項目的圖像。當列表的滾動狀態變爲SCROLL_STATE_IDLE時,我調用這個方法。這使得用戶可以滾動,並且在滾動停止之前不會執行任務以獲取可見行的圖像,從而防止它查看離屏行的圖像。

我的問題是,當結果最初顯示在ListView中時,我無法找到調用我的方法查找要查詢哪些圖像ID的好方法。顯然,在調用setAdapter之後立即調用這個方法是行不通的(我猜測是因爲ListView的一些工作異步發生)。我使用多個適配器(因爲與本文不相關的原因),所以在調用我的方法獲取ID之前,我需要一個等待列表項顯示的好方法。

任何想法?

回答

1

你設置了適配器或稱爲notifyDatasetChanged()適配器上後,添加「加載圖片」代碼列表的張貼隊列作爲一個Runnable:

list.post(new Runnable() { 
    @Override 
    public void run() { 
    //do stuff 
    } 
    }); 
+0

真棒。謝謝。 – Andrew

+0

如果您有興趣,我現在就做同樣的事情,並且我發現'SCROLL_STATE_IDLE'不像我想的那樣精確,所以我實現了一些更有趣的事情。我以前發佈這個答案[這裏](http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview/6358818#6358818 )。 – dmon

0

如果我正確的理解你的問題,您無法通過網絡和性能問題加載圖片;如果是這樣,

我會創造我的適配器一個簡單的圖像緩存如本地,但全球的HashMap:

 
private HashMap&ltString, Drawable> imgCache = new HashMap&ltString, Drawable>(); 

然後在我的getView()方法,我會以異步方式(使用一個線程和處理程序)加載圖像,並通過將位置作爲關鍵字並將加載的圖像指定爲Drawable,將加載的圖像保存在我的imgCache中。

 
final Handler h = new Handler() { 
    public void handleMessage(Message msg) { 
     if(msg.obj != null) { 
      Drawable drawable = (Drawable)msg.obj; 
      image.setImageDrawable(drawable); 
      image.postInvalidate(); 
      image.requestLayout(); 
      imgCache.put(cacheKey, drawable); 
     } 
    } 
}; 
loadImage(myImageView, imageURL, h); // threaded method which loads the images from net 

也是,在我getView()方法,我會先問imgCache,看看是否已經存在的圖像的LoadImage被調用之前。

這應該優化您的列表,並使用多個適配器等

希望這有助於拯救你,

-serkan

+0

我已經完成了所有這些。問題是如果從頂部滾動到底部,使用getView()將加載列表的所有圖像。這是浪費時間和記憶。它應該只嘗試尋找用戶可以看到的圖像。所以,我將代碼從getView移動到onScrollChanged。 – Andrew