【问题标题】:How to refresh RecyclerView of hidden fragment?如何刷新隐藏片段的 RecyclerView?
【发布时间】:2021-07-18 07:22:16
【问题描述】:

我有两个 Fragments A 和 B 以及 RecyclerView 列表。
当片段 A 处于活动状态时,我调用:

 fragmentTransaction.hide(Frag_A);

然后我用命令添加 fragment B

 fragmentTransaction.add(R.id.fragment_container, Frag_B);

fragment B 处于活动状态并且我进行一些更改时,我需要静默调用:

 mAdapter.notifyDataSetChanged();

片段A上。
那么当片段被隐藏时可以调用它吗?
现在我正在使用

@Override
 public void onHiddenChanged(boolean hidden) {
      super.onHiddenChanged(hidden);
    }

但是当我从片段 B 回到 A 时会触发此方法。
我想在 fragment B 处于活动状态时刷新 fragment A。 (用户见片段 B 列表)。
该怎么做?

【问题讨论】:

  • 你考虑过用replace代替add吗?
  • 是的,但是 Fragment A 有完整列表,当用户没有进行任何更改时,我不想刷新整个列表,从 Fragment B 回到 A每次。我只想在用户更改 Fragment B 中的某些数据并返回 Fragment A 时刷新此列表。

标签: android android-fragments android-recyclerview android-adapter


【解决方案1】:

据我了解,您希望在 FragmentB 处于活动状态时刷新 FragmentA 中的数据。

首先,你已经创建了一个接口

interface FragmentCallback {
   fun onResumeFragment()
}

接下来,在你想去FragmentA之前,你正在使用add方法。所以,你必须为FragmentA添加一个tag

private fun loadFragmentA(someId: Int) {
    val bun = Bundle()
    bun.apply {
        putInt(Constant.SOME_ID, someId)
    }
    val fragmentA = FragmentA()
    fragmentA.arguments = bun
    val fragmentManager = supportFragmentManager
    val fragmentTransaction: FragmentTransaction =
        fragmentManager.beginTransaction()
    fragmentTransaction.add(
        R.id.fragment_container,
        fragmentA,
        "TagFragmentA"
    )
    fragmentTransaction.commit()
}

MainActivity,你需要实现我们创建的接口。在onResumeFragment 方法中,我们必须使用tag 找到FragmentA。所以,我们可以使用fragment里面的方法。

class MainActivity : AppCompatActivity(), FragmentCallback {

    override fun onResumeFragment() {
        val fragmentA =
            supportFragmentManager.findFragmentByTag("TagFragmentA") as FragmentA
        fragmentA.refreshData()
    }
}

FragmentA 内部,创建refreshData 方法并将其公开。所以在这个方法里面,你可以通知数据发生了变化。

fun refreshData(){
    viewModel.getListSomething()
}

FragmentB内部,你需要重写onAttach方法来为FragmentCallback创建对象。

private var fragmentCallback: FragmentCallback? = null
override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is FragmentCallback) {
        fragmentCallback = context
    } else {
        throw RuntimeException(
            context.javaClass.simpleName
                .toString() + " must implement FragmentCallback"
        )
    }
}

最后创建一个有数据变化时触发的方法。

private fun timeToUpdateDataAtFragmentA(){
    fragmentCallback?.onResumeFragment()
}

当你从FragmentB返回到FragmentA时,数据会在FragmentA更新。

【讨论】:

  • 是的。它正在工作,谢谢。我已经有一个接口。但我有一些错误......没关系......我有两个问题。如果我在 onViewCreated 中写“fragmentCallback = context”,我会收到一个错误,但如果我在 onAttach 方法中这样做,问题就会消失,就像你呈现给我一样。为什么会这样?我们总是应该将上下文传递给 onAttach 中的接口吗?为什么不在 onViewCreated 或 on Create 中?
  • 第二:你写 viewModel.getListSomething();我的 LiveData 工作正常,我只需要刷新 RecyclerView,所以我使用了 mAdapter.notifyDataSetChanges()。没关系?或者我应该使用 viemodel 再次下载列表,然后使用来自 VieModel 的新数据刷新适配器,或者我可以像我那样只刷新 recyclerView 吗?
  • @L23ko 1. onViewCreated ,与onAttach相比,没有提供contextcontext 将通过 onAttach。因此,一旦附加了 Fragment,它就可以使用。 2.我认为你必须自己尝试一下。这样您就会知道哪一个最适合您的要求。
  • 好的。感谢您的回复:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2018-10-11
  • 2021-12-25
  • 2014-09-06
相关资源
最近更新 更多