【发布时间】:2020-07-29 15:54:11
【问题描述】:
我第一次在我的应用程序中使用带有导航组件的数据绑定和片段。在导航和加载我的列表方面一切正常。我遇到的问题是这样的:
当我在我的列表中并单击其中一项时,我会导航到该项的详细信息片段。但是当我返回列表(onBack)时,片段和列表再次加载,它们被重新创建。
我想要实现的是片段和列表不会重新创建。他们保持相同的状态,这样当我从细节返回时,我可以从我离开的地方继续浏览我的列表。
我的代码:
片段
class ListFragment : Fragment() {
private lateinit var viewDataBinding: FragmentListBinding
private lateinit var adapter: ListAdapter
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
viewDataBinding = FragmentListBinding.inflate(inflater, container, false).apply {
viewmodel = ViewModelProviders.of(this@ListFragment).get(ListViewModel::class.java)
lifecycleOwner = viewLifecycleOwner
}
return viewDataBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupAdapter()
setupObservers()
}
private fun setupObservers() {
viewDataBinding.viewmodel?.listLive?.observe(viewLifecycleOwner, Observer {
adapter.updateList(it)
})
viewDataBinding.viewmodel?.toastMessage?.observe(viewLifecycleOwner, Observer {
activity?.longToast(it)
})
}
private fun setupAdapter() {
val viewModel = viewDataBinding.viewmodel
if (viewModel != null) {
adapter = ListAdapter(viewDataBinding.viewmodel!!)
val layoutManager = LinearLayoutManager(activity)
list_rv.layoutManager = layoutManager
list_rv.adapter = adapter
}
}
override fun onResume() {
super.onResume()
viewDataBinding.viewmodel?.fetchList()
}
}
片段布局
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="viewmodel"
type="app.example.list.ListViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="@{safeUnbox(viewmodel.dataLoading) ? View.GONE : View.VISIBLE}" />
</RelativeLayout>
查看模型
class ListViewModel : BaseViewModel() {
val listLive = MutableLiveData<List<Item>>()
fun fetchList() {
dataLoading.value = true
ItemRepository.getInstance().getList() { isSuccess, response ->
dataLoading.value = false
if (isSuccess) {
listLive.value = response?.items
empty.value = false
} else {
empty.value = true
}
}
}
}
我正在列表和带有导航的项目之间导航
itemView.findNavController().navigate(R.id.action_listFragment_to_detailFragment)
【问题讨论】:
-
那么你到底在哪里打电话给
fetchList()?如果您不止一次调用它,为什么要这样做,除非是因为您想再次加载数据? -
@ianhanniballake 我忘记显示我在哪里执行 fetchList,在我的片段中检查我的更新,我正在 onResume 中执行它。这导致列表每次都更新,但如果我将 fetchList 放入 onViewCreated 也会发生同样的事情,因为每次导航到它时都会重新创建片段。
-
@ianhanniballake 我想如果我可以在 onCreate 中初始化我的 viewDataBinding,如果只在创建时调用该方法,就会在那里生成 fetchList,我可以解决我的问题。但我没有看到它可以做到
标签: android kotlin data-binding android-databinding android-architecture-navigation