2013-08-26 76 views
1

我一直在使用listview,但突然間我經歷了一些隨機行爲。 當我在列表視圖上調用invalidateViews()時,在某些情況下,它會重新膨脹每行的視圖,並且在某些情況下不會。這完全是隨機的。你能確切地告訴我它是如何工作的? 理想情況下,它應該刷新視圖(行)內的數據,而不是再次膨脹它們。在Listview上調用invalidateViews()是否重新膨脹視圖的行?

感謝

回答

0

其實,listview.invalidateViews()導致要重建,並重新繪製各方面的意見。當你嘗試選擇invalidateViews()時,當你在描述中看到描述時,你會明白這一點。

0

適配器的getView()方法的參數convertView是空第一次,當你填充一個列表視圖,以後當你滾動/取消你的ListView convertView不爲空,所以你可以使用它,不需要充氣一個新行

2

調用invalidateViews() on ListView不應該重新膨脹ListView項目視圖。強制ListView重新擴展其項目視圖的唯一方法是,重新設置ListView適配器(我必須挖掘源代碼才能發現),這意味着清除了循環視圖。

如果你看一看的invalidateViews()方法實現(AbsListView.java源代碼),你會看到這個(安卓API 16):

/** 
* Causes all the views to be rebuilt and redrawn. 
*/ 
public void invalidateViews() { 
    mDataChanged = true; 
    rememberSyncState(); 
    requestLayout(); 
    invalidate(); 
} 

的方法rememberSyncState()在AdapterView.java中實現的存儲所選項目的ListView位置(如果有的話),您可以檢查它。

requestLayout()方法負責測量,佈局和繪圖(據我所知),所以這裏也沒有。

最後無效()用於強制列表視圖中繪製(用新的測量,...)

所以調用invalidateViews()應該不強制列表視圖重新擴大意見。 您是否可以重新設置適配器的某個位置,以便重新充滿所有視圖?

+0

正是!它不應該,但不知何故它是重新充氣的行,這是隨機的。任何線索,爲什麼?不,我不在任何地方重置適配器。 謝謝 –