2014-02-09 26 views
1

我有一個GridView包含ImageView s,我想刷新View s,如果圖像被成功下載並轉換爲Bitmap對象。該GridView的適配器具有getView方法,可以如果存在一個默認的圖像或解碼設置爲Bitmap下載的圖像。有效更新GridView子視圖

要刷新的GridView我可以使用myGridView.getAdapter().notifyDataSetChanged()方法,所以我創建了一個BroadcastReceiver能夠檢測是否成功下載的文件是我需要的圖像之一,並最終發送Listener事件到活動包含GridView刷新它。由於GridView控件適配器甚至可以包含數千個元素,我想如果View針對特定的文件是可見的執行發射notifyDataSetChanged只。

我認爲做這樣的事情:

for(int i=0;i<myGridView.getChildCount();i++){ 
    if(myGridView.getChildAt(i).isTheOneINeed) { //notifyDataSetChanged(); break; } 
} 

但我有點擔心:如果用戶滾動的GridView和childView變成零,或者它通過在接下來的項目之一代替Adapter?有沒有更安全的方法來做到這一點?

回答

3

我個人的意見是,你不應該ListView/GridView孩子一起玩(除非你真的需要)。如果您的數據已更改,則應撥打notifyDataSetChanged()ListView/GridView只會重畫幾個項目(即可見的項目),即使您擁有數千個項目也是如此。

優化你的代碼,並呼籲notifyDataSetChanged()只有當項目是可見的,你可以通過調用getFirstVisiblePosition()getLastVisiblePosition()

+0

'getVisiblePosition'方法似乎是我一直在尋找的! – Vektor88

1

獲得第一和最後一個顯眼的位置我猜你Activity使用一個AsyncTask下載圖像,然後在AdaptergetView()方法中解碼。如果您的應用程序滾動的用戶上下太快,那麼你的圖像可以得到模糊/交換,並作爲AsyncTask線程陷入瘋狂的嘗試,以應付下載&緩存和您的Adapter鬥爭與解碼您的應用程序可能不響應。

你聽說過新的凌空網絡庫的Android?它由Google開發(它是AOSP的一部分)。我建議你試一試,因爲它默認是異步的(它提取下載,緩存解碼,同時爲開發者提供一個非常乾淨的接口)。我使用它進行HTTP請求&圖像下載,並且它非常快速和穩定。你甚至可以控制線程優先級&取消。沒有模糊或口吃的listviews/gridviews,它可以輕鬆地處理非常大的圖像。畢加索是圖像下載部分的另一個很好的選擇。畢加索比排球稍慢下載圖像,但它只是作爲穩定和TRIVIAL整合(在適配器中的一行代碼)。

即使您沒有將notifyDatasetChanged()方法添加到您的AdaptergetView()(儘管這樣做是很好的做法),排氣式和畢加索也能很好地工作。由於getView()方法是按需調用的,因此只能在用戶向下滾動時下載圖像。

查看圖像與截擊here下載的例子。

+0

感謝您的建議!我切換到Volley是因爲在幾行代碼中都做了一切。但我不確定我能接受這個答案,因爲這不是我的問題的直接答案。 Upvote肯定! – Vektor88