В разрабатываемом приложении Android у меня есть фрагмент списка, который показывает RecyclerView
элементов списка. Когда мы открываем фрагмент в первый раз, он извлекает список из URL, но он не будет меняться достаточно часто, чтобы продолжать его перезагружать, поэтому я хочу сохранить данные. Насколько я могу сказать, Android способ сделать это - использовать savedInstanceState
для фрагмента, например:
class ItemListFragment() {
private var itemCards: RecyclerView? = null;
public val Items: ArrayList<Item> = ArrayList<Item>()
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
if ( Items.size == 0 && savedInstanceState != null && savedInstanceState.containsKey("items")) {
val arrayType = object: TypeToken<Array<Item>>() {}.type
val tempItems: Array<Item> = Gson().fromJson(savedInstanceState.getString("items"), arrayType)
Items.addAll(tempItems)
}
}
}
Затем я управляю состояниями в моем MainActivity
следующим образом:
class MainActivity : AppCompatActivity() {
private lateinit var restoreBundle: HashMap<String, Bundle>
private var currentFragment = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
restoreBundle = HashMap<String, Bundle>()
setContentView(R.layout.activity_main)
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
drawFragment(item.itemId)
}
private fun drawFragment(position:Int) {
val fragMan: FragmentManager = getSupportFragmentManager()
val fragmentName = getFragmentName(position)
val bundle:Bundle = restoreBundle.get(fragmentName) ?: Bundle()
var fragment: Fragment? = fragMan.getFragment(bundle, fragmentName)
if ( fragment == null ) {
fragment = ItemListFragment() as Fragment
}
val current = fragMan.findFragmentByTag(currentFragment)
if (current != null) {
val frag = getFragmentName(current.id)
val recover : Bundle = restoreBundle.get(frag) ?: Bundle()
current.onSaveInstanceState(recover)
restoreBundle.set(frag, recover);
}
if (fragmentSet) {
fragMan.beginTransaction()
.replace(R.id.main_content_fragment, fragment!!, fragmentName).commit()
} else {
fragMan.beginTransaction()
.add(R.id.main_content_fragment, fragment!!, fragmentName).commit()
}
currentFragment = fragmentName
}
}
Оба эти примера были урезаны до того, что мне кажется уместным, но код может быть не столько проблемой, сколько тем, что я пытаюсь сделать. В основном, когда я переключаю фрагмент несколько раз и он вызывает fragMan.getFragment(bundle, fragmentName)
, bundle
содержит правильное сохраненное состояние экземпляра, но когда я попадаю в ItemListFragment.onViewStateRestored
(это следующее место, я могу установить точку останова, насколько я могу судить, ) пакет savedInstanceState
равен нулю.
Почему пакет, который я передаю, не совпадает с пакетом, который извлекается или , как правильно передать состояние экземпляра моему фрагмент?