您可能在開發過程當中遇到過這種狀況,在 Activity/Fragment 被從新建立後,RecyclerView 丟失了它以前保有的滾動位置信息。一般這種狀況發生的緣由是因爲異步加載 Adapter 數據,且數據在 RecyclerView 須要進行佈局的時候還沒有加載完成,致使 RecyclerView 沒法恢復到以前的滾動位置。android
從 1.2.0-alpha02 版本開始,Jetpack RecyclerView 提供了一個新的 API,可讓 Adapter 在數據加載完成以前阻塞佈局行爲 ,從而避免丟失滾動位置信息。接下來咱們會介紹如何使用這個新的 API,以及它的工做原理。緩存
有好幾種方法能夠用來恢復 RecyclerView 至正確的滾動位置,您可能已經在實際項目中用到了這些方法。其中最好的一種方法是將數據提早緩存在內存、ViewModel 或 Repository 中,而後確保在第一次佈局傳入以前,將緩存的數據設置到 Adapter 中去。若是根據您的項目實際狀況沒法採用這種方法,那也可使用其餘的方法,只是要麼比較複雜 (好比避免在 RecyclerView 中設置 Adapter,但這樣又有可能致使像 header 等 item 的顯示問題),要麼會致使 LayoutManager.onRestoreInstanceState) API 被濫用。異步
recyclerview:1.2.0-alpha02 版本中提供的解決方案是引入一個新的 Adapter 方法,來容許您設置它的狀態恢復策略 (經過枚舉類型 StateRestorationPolicy)。它有三個選項:佈局
經過以下示例代碼可設置 adapter 的狀態恢復策略:google
adapter.stateRestorationPolicy = PREVENT_WHEN_EMPTY
經過這篇短小精悍的文章您能夠了解到關於 RecyclerView 的延遲狀態恢復 (lazy state restoration) 功能。趕快開始使用吧!rest