如何刷新隐藏片段的RecyclerView?

How to refresh RecyclerView of hidden fragment?

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

 fragmentTransaction.hide(Frag_A);

然后我使用命令添加 片段 B

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

片段 B 处于活动状态并且我做了一些更改时,我需要静默调用:

 mAdapter.notifyDataSetChanged();

关于 片段 A
所以当片段被隐藏时可以调用它吗?
现在我正在使用

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

但是当我从片段B回到片段A时触发了这个方法。
片段 B 处于活动状态时,我想刷新 片段 A。 (用户查看片段 B 列表)。
怎么做?

据我了解,您想在 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 方法并使其成为 public。所以在这个方法里面,你可以通知数据改变了。

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 处更新。