2014-10-05 134 views
2

我一直在試圖理解BaseAdapter.hasStableIds()是如何工作的。讓BaseAdapter.hasStableIds()返回真正解決什麼?

從我讀過的內容中,返回true可以幫助適配器確定視圖是否必須重新創建或保持不變。我猜測適配器以某種方式將位置映射到一個id,並且如果映射保持不變,那麼調用notifyDataSetChanged()時,適配器不執行任何操作。

但是,如果數據已更改,而id(和位置)保持不變,這不會是一個問題嗎?如果這確實是一個問題,那麼到底什麼時候才能真正恢復真正的幫助?

回答

3

hasStableIds() == true意味着項目ID不會更改基礎數據項目,也不會更改該項目的數據。例如。相同的聯繫人具有相同的ID,無論它出現在列表中的哪個位置,但其名稱可能隨時間而改變 - 用戶可以編輯它,添加暱稱等等。可以想象在每個項目沒有穩定ID的情況下顯示數據(也許數據不是你的,你無法訪問適合從getItemId()返回的唯一ID,例如與long返回類型不兼容)。

在瀏覽爲AdapterViewAbsListView的源代碼,在我看來,當你設置一個ListView/GridView的選擇模式,這是最有用,因爲這樣的觀點可以做檢查物品ID的一些更有效的管理和它們是可視狀態,包括跨數據集更改,其中那些已檢查的項目可能已移至新位置(但它們具有相同的ID)。

+0

謝謝你的解釋。你可以看看這個:[Android - StableIDs是什麼意思?](http://stackoverflow.com/a/18217552/3954358)?那麼給定的答案是錯誤的? – Athena 2014-10-05 20:18:11

+0

說實話,我不是100%確定的。特別是'ListView'是Android中最複雜的視圖類之一,它背後的代碼將需要相當長的時間來包裝頭部。我認爲在回收意見方面可能會有一些優化,但對我來說這似乎很奇怪; ListView應該爲每一行調用'getView()',然後在'notifyDataSetChanged'之後顯示每一行,以便填充每一行中的數據...... – Karakuri 2014-10-06 05:44:57

+0

** ListView應該爲每一行調用getView()在notifyDataSetChanged後顯示反正**你是怎麼想的? – 2017-08-02 18:03:15