2010-04-04 46 views
5

我有以下的問題後恢復:複選框中的ListView「經過」被滾動

我有一個ListActivity,其ListView中由圖標,文本和一個複選框(使用LayoutInflater)組成。

爲ListView適配器延伸ResourceCursorAdapter

一切工作相當好,(即ListView中的數據源是從一個數據庫中,還各行的經過狀態檢索)除了當我取消/選中複選框在任何行中,如果向下滾動,直到修改後的複選框不再可見,然後向上滾動,複選框將恢復到其原始狀態。

數據庫被修改,這不是問題(即如果我修改一行並退出活動,再次輸入,修改後的行顯示爲Ok)。

我的猜測是,這是有關如何呈現列表的一些事情,因爲由於某種原因,ListView「呈現」所有行滾動時第一次填充時的原始狀態。

我一直在尋找這個錯誤,但我沒有發現任何人有這個問題。我很欣賞你的建議。

回答

1

問題是通過在修改數據庫後關閉相應的遊標並使用changeCursor()再次打開它來解決的。

+0

你能告訴我在哪裏寫這個重新打開遊標代碼?我的意思是在bindview或newview或其他地方? – Hunt 2012-02-24 19:08:26

1

當項目進入視圖時,您的ListAdapter.getView()方法將被調用。

這可能會在每個會話中發生多次,例如,如果您將該項目從屏幕上滾動然後再次打開。

我建議你在getView()上放一個斷點,然後用調試器運行應用程序。重複測試,並在第二次調用getView()時,檢查設置複選框的邏輯。

另一個考慮因素是getView的第二個參數是'convertView'視圖。這是來自其他列表條目的不再可見的您自己的視圖之一。操作系統正在向您返回這個視圖,以便您可以選擇「回收」視圖來創建新條目,而不是對新條目進行充氣,這會對性能產生影響。

如果你忽略了這個參數,這將不會是一個問題(儘管要製作一個平滑的滾動列表,你可能會考慮將來使用它 - 只要記住檢查視圖是你期望的類型,通過設置標籤)。

如果您選擇使用此參數來嘗試視圖回收,請檢查您的邏輯並確保將所有控件設置爲所需狀態,因爲佈局默認狀態可能不適用。

+0

感謝您的回覆。 據我所知,對於CursorAdapter,我應該在bindView方法中修改View的內容。 我不確定在這種情況下是否使用getView。或者無論如何,bindView何時會被調用,何時getView? 現在我沒有使用getView,只是newView和bindView。我研究了一些關於getView和使用convertView來回收視圖,但我仍然困惑bindView將被調用(getView和bindView將具有相同的代碼?) 此外,bindView不會通過convertView但只是一個視圖。 – adrianrdzv 2010-04-04 16:30:15

2

此鏈接提供了一個深入瞭解的問題

EditText items in a scrolling list lose their changes when scrolled off the screen

列表行得到回收。您的光標 可能有1,000條記錄,但有 不會是1000 EditText 如果您通過列表滾動 創建窗口小部件。相反,將會有10或 ,這取決於同時可見多少行 。行得到 回收,並且綁定操作 將與光標的新值代替舊的EditText值 爲 任何行只是滾動到 屏幕,更換任何在那裏 之前從 數據庫或一個(前值用戶編輯的值)。

相關問題