开发者社区 问答 正文

加载微调器显示使用Arc中的导航时不需要的

我有以下项目:https://bitbucket.org/ali-rezaei/storytel/src/master/

我正在使用Android架构组件中的导航库。

当我导航屏幕内容,然后返回到主屏幕,onCreateView并onActivityCreated获得MainFragment再次调用。因此viewModel.showPosts().let { compositeDisposable.add(it) }被称为:

fun showPosts(): Disposable { _isLoading.postValue(true) EspressoIdlingResource.increment() // App is busy until further notice return Network.items.getPosts() .subscribeOn(schedulerProvider.io()) .observeOn(schedulerProvider.ui()) .doFinally { if (!EspressoIdlingResource.countingIdlingResource.isIdleNow) { EspressoIdlingResource.decrement() // Set app as idle. } _isLoading.postValue(false) } .subscribe({ _isDataLoadingError.postValue(false) _posts.postValue(it) }) { _isDataLoadingError.postValue(true) Timber.e(it) } } 它再次在RecyclerView上显示加载微调器,这是不需要的。我该如何解决?

展开
收起
被纵养的懒猫 2019-09-20 20:18:21 423 分享 版权
阿里云 AI 助理回答

在Android中使用Navigation组件时,避免在返回到已经创建的Fragment时重新加载数据或执行不必要的初始化操作,可以通过以下几种策略来解决:

  1. 利用ViewModel的生命周期: ViewModel的设计初衷是跨Fragment的重建过程存活,因此可以在这里存储和管理UI相关的数据。确保你的MainFragment使用了ViewModelProvider来获取ViewModel实例,并且不要在onCreateViewonActivityCreated中直接调用加载数据的方法。而是在ViewModel中检查是否已经加载过数据,例如设置一个标志位。

  2. 使用Fragment的savedInstanceState: 在onCreateViewonActivityCreated中检查savedInstanceState是否为null。如果非null,意味着Fragment是从回退栈恢复而不是新创建的,这时可以跳过数据加载逻辑。

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    if (savedInstanceState == null) {
        viewModel.showPosts().let { compositeDisposable.add(it) }
    }
}
  1. 利用LifecycleObserver: 你可以在ViewModel中添加一个LifecycleObserver,监听Fragment的生命周期事件,仅在Fragment首次创建时加载数据。

  2. 导航选项中的popBehavior: 如果你是通过NavOptions进行导航的,可以考虑设置popUpTopopUpToInclusive属性来控制返回栈的行为,但这通常用于处理返回逻辑而非直接解决数据重载问题。

  3. 自定义返回处理: 在需要的地方自定义返回按钮的逻辑,确保当用户返回到主Fragment时,不触发额外的数据加载。

  4. RecyclerView的状态保存: 确保RecyclerView的状态(如滚动位置)在配置改变或Fragment重建时得到保存和恢复,这虽然不直接影响数据加载,但能提升用户体验。

综上所述,主要思路是利用ViewModel维护数据状态,结合Fragment的生命周期来判断是否需要重新加载数据。这样,即使用户导航回来,也不会重复执行不必要的加载逻辑。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: