如何刷新隐藏片段的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
处更新。
我有两个 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
处更新。