2012-08-07 107 views
1

我具有與本片段的活性加載一個GridView。 GridView本身不在Fragment中。我通過BaseAdapter創建了一個客戶適配器,並且一切都很好用。更新的GridView子

CustomerAdapter.java

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ImageView v = new ImageView(activity); 
    Bitmap bmp = getBitmap(videoIds[ position ]); 
    v.setImageBitmap(bmp); 
    v.setAdjustViewBounds(true); 
    v.setPadding(5, 5, 5, 5); 
    v.setId(position); 

    thumbnails[ position ] = bmp; 

    return v; 

} 

我有一個上下文行動起來吧,讓你選擇的視頻被上傳,刪除等

videoGallery.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL); 
videoGallery.setMultiChoiceModeListener(new MultiChoiceModeListener() { ... } 

我要添加視頻周圍邊框當選擇填充時,我需要做的就是添加背景顏色。所以我在上面列出的新的MultiChoiceModeListener()部分中有:

@Override 
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 
ImageView image = (ImageView)videoGallery.findViewById(position); 
    if(checked) { 
     image.setBackgroundColor(Color.YELLOW); 
    } else { 
     image.setBackgroundColor(Color.TRANSPARENT); 
    } 
    int count = videoGallery.getCheckedItemCount(); 
    if(count == 1) { 
     mode.setSubtitle("1 item selected."); 
    } else if(count != 0) { 
     mode.setSubtitle(count + " items selected."); 
    } else { 
     mode.setSubtitle(null); 
    } 
} 

問題是子視圖不更新。標題被更新爲「選擇了1項,選擇了2項等),所以我知道該方法正在被調用,並且設置背景確實會產生背景,所以並不是我只是無法看到變化。本身沒有更新。我甚至設置的意見隨機ID被創建時,做image.getId()提供了正確的ID,所以我知道它是找到的看法。這是不更新它。任何幫助嗎?

+0

不是一個確切的回答你的問題,但它可能是更容易使用國家列表繪製,這裏http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList的解釋那麼系統會自動爲您處理。 – 2012-08-07 19:28:42

+0

當調用onItemCheckedStateChange()時,系統是否足夠聰明以自動觸發狀態變化?因爲我無法從代碼中觸發任何東西,這就是我的問題所在。 – 2012-08-07 19:38:05

+0

是的,當該項目被選中時,視圖將被重新繪製,對應於可繪製狀態列表中的「checked」狀態的drawable。您可能需要在videoGallery上調用setItemChecked(position,true),但這不太可能。 – 2012-08-07 19:50:05

回答

1

這似乎並不正確:

ImageView image = (ImageView)videoGallery.findViewById(position); 

的原因:位置被設置爲0 < =位置< =計數1的ID是一個完全不同的事情

你需要更新的原始數據本身,並告訴適配器使用notifyDataSetChanged更新其觀點,例如()。


編輯:

,這不是唯一的問題。真正的問題是,你創造的,而不是循環使用爲getView(),總是一個新的ImageView的(這,順便說一句,會導致內存泄漏,因爲適配器視圖緩存它創建的視圖)。你應該真的看視頻「the world of listView」。

,它不爲你工作的原因是,您訪問不再使用的舊觀點。

+0

我試着將ID改爲所有不同的東西。我能夠在圖像視圖上執行'.setId(5000 +位置)',並使用此方法在GridView中打印出ImageView的所有ID,它們分別是5000,50001等。因此,我能夠訪問該視圖,但我所做的任何更改都未應用。 – 2012-08-08 01:03:38

+0

看到我更新的答案。 – 2012-08-08 08:19:15

+0

完美。我知道它必須是這樣的!謝謝。 – 2012-08-08 16:02:04