程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> ListView視圖緩存錯位問題

ListView視圖緩存錯位問題

編輯:C++入門知識

ListView視圖緩存錯位問題


由於之前寫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數據,所以即使屏幕大也看不到。



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved