由於之前寫Scroller應用:ListView滑動刪除遇到Item視圖錯位問題,觀察發現第1item位置改變後,第1+10的item布局也跟著改變,如果使用ScrollView+ListView,把ListView的高度測量出來然後再滑動就不會出現錯位問題,繼續查看之所以間隔10,我屏幕上顯示10條數據,這個就涉及到getCount()和getChildCount()問題,進一步追蹤發現應該是ListView視圖緩存的問題,其實這個問題跟數據是一樣的,不過我們在Adapter的getView中根據不同的position設置不同的數據,這個動作是實時改變的,getChildCount()返回的是內存中的item數目,getCount()返回的是實際的數據數目,ListView中實際的item布局也就是getChildCount()的值,如果采用測量ListView設置其高度的話,那getChildCount()等於getCount(),在ListView中有這麼一段代碼
// Pull all children into the RecycleBin. // These views will be reused if possible final int firstPosition = mFirstPosition; final RecycleBin recycleBin = mRecycler; // reset the focus restoration View focusLayoutRestoreDirectChild = null; // Don't put header or footer views into the Recycler. Those are // already cached in mHeaderViews; if (dataChanged) { for (int i = 0; i < childCount; i++) { recycleBin.addScrapView(getChildAt(i), firstPosition+i); } } else { recycleBin.fillActiveViews(childCount, firstPosition); }firstPosition是第一個可見的item的位置,recycleBin.addScrapView(getChildAt(i), firstPosition+i);緩存隱藏item的時候,都是使用getChildCount()內的現有的View視圖,所以解決錯位問題必須采用位置的標記來處理,而且標記也不能在自定義的item中進行,必須在外部例如自定義ListView中記錄。在Scroller應用:ListView滑動刪除中采用的是規避的方式,滑動就關閉之前打開的item,看了QQ消息列表也是滑動的話就隱藏刪除按鈕,我不知道是否規避這個問題,因為ListView內存的item數據一般大於屏幕可見的item數據,所以即使屏幕大也看不到。