android - 如何防止在背面 fragment 导航中再次设置 View 模型

标签 android mvvm kotlin navigation android-jetpack

我正在使用Android Jetpack导航,MVVM和dataBinding,并且遇到了一个问题。每当我从详细信息片段导航回来时,我的主List片段都会刷新(再次调用API,并再次绘制recyclerList)。我该如何预防?

这是主列表片段代码:

class PostListFragment : BaseFragment() {

private lateinit var viewModel: PostListViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    val binding = TestFragmentBinding.inflate(inflater, container, false)
    val factory = InjectorUtils.providePostListViewModelFactory()
    viewModel = ViewModelProviders.of(this, factory).get(PostListViewModel::class.java)

    val adapter = MainListAdapter()
    binding.mainList.adapter = adapter

    binding.let {
        it.viewmodel = viewModel
        it.setLifecycleOwner(this@PostListFragment)
    }

    subscribeUi(adapter)
    return binding.root
}

private fun subscribeUi(adapter: MainListAdapter) {

    viewModel.progressVisible.postValue(true)
    addToDisposable(viewModel.getContentRepository().getAllPosts(requireContext())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            viewModel.progressVisible.postValue(false)
            adapter.submitList(result)
        }, { error ->
            viewModel.progressVisible.postValue(false)
        }))
}

}

我还要补充一点,我正在MainFragment上使用此片段,其中包含viewPager。

我的MainFragment代码:
class MainFragment : Fragment() {

private lateinit var sharedViewModel: SharedNewPostViewModel
private lateinit var viewModel: MainViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

    val binding = MainFragmentBinding.inflate(inflater, container, false)

    val factory = InjectorUtils.provideMainViewModelFactory()
    viewModel = ViewModelProviders.of(this, factory).get(MainViewModel::class.java)

    binding.let {
        it.viewModel = viewModel
        it.setLifecycleOwner(this@MainFragment)
    }

    sharedViewModel = activity?.run {
        ViewModelProviders.of(this).get(SharedNewPostViewModel::class.java)
    } ?: throw Exception("Invalid activity")

    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val pagerAdapter = MainPagerAdapter(childFragmentManager)

    viewPager.adapter = pagerAdapter
    tabLayout.setupWithViewPager(viewPager)
}

}

最佳答案

需要先检查savedInstanceState中的Activity.onCreate():

if(savedInstanceState == null) {
    ...
}

并且当它不是null时,请不要给Fragment充气-以后不会再调用Fragment.onCreateView()两次(否则很难从那里返回View)。

关于android - 如何防止在背面 fragment 导航中再次设置 View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54519452/

相关文章:

java - 使用 Intent 在 Activity 之间传递自定义对象

java - 我有保留窗口,但数据未保存。如何将 boolean 值存储到数据库中?

java - 在Android上所有可滑动的应用程序顶部创建一个边缘热点

javascript - Android 上的 Cordova getFile 错误,无错误代码

java - 从Java,Android调用Kotlin?

android - EditText中的DrawableButton可以显示/隐藏密码并更改DrawableEnd

.net - 简单但显示有关 WPF 和 MVVM 知识的面试任务

c# - 使用相同的 ViewModel 打开两个窗口时无法设置单选按钮值

wpf - View 模型实现 IDataErrorInfo 进行验证是个好主意吗?

kotlin - 如何在 android studio 中实现 Admob Interstitial Ad - Kotlin