Fragment内TabLayout+ViewPager从二级页返回时首标签Recyclerview不刷新问题
问题根因
你使用的FragmentPagerAdapter默认会缓存已加载的Fragment实例,从表单页返回宿主Fragment时,即使onViewCreated重新执行,你新创建的HomeFragment实例和ViewPager中已经缓存并显示的实例不是同一个,你在onViewCreated中拉取的新数据没有同步到已显示的HomeFragment中,只有切换标签触发ViewPager重新绑定Fragment时才会刷新数据。
解决方案
方案1:使用Fragment Result API(最推荐,耦合度最低)
不需要修改原有适配器逻辑,通过系统自带的跨页面通知能力实现刷新触发:
- 在HomeFragment的
onViewCreated中注册表单提交的结果监听:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 注册表单提交成功的监听 setFragmentResultListener("form_submit_success") { _, _ -> // 调用你HomeFragment内刷新RecyclerView的方法 refreshHomeListData() } // 原有其他初始化逻辑 }
- 在表单提交成功、执行返回操作前发送通知:
// 表单提交接口回调成功后执行 setFragmentResult("form_submit_success", bundleOf()) // 执行返回逻辑,如popBackStack、finish等
方案2:修改适配器主动获取缓存实例触发刷新
如果需要更直接的调用,可以修改适配器保存已创建的Fragment实例,返回时主动调用刷新方法:
- 修改
MyAdapter,增加实例存储和获取能力,同时替换为推荐的行为参数:
class MyAdapter(private val myContext: Context, fm: FragmentManager, internal var totalTabs: Int) : // 替换为推荐的BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT参数 FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { // 存储已创建的Fragment实例 private val createdFragments = arrayOfNulls<Fragment>(totalTabs) override fun getItem(position: Int): Fragment { val fragment = when (position) { 0 -> HomeFragment() 1 -> SportFragment() 2 -> MovieFragment() else -> throw IllegalArgumentException("非法Tab位置") } createdFragments[position] = fragment return fragment } // 对外提供获取Fragment的方法 fun getTabFragment(position: Int): Fragment? { return if (position in createdFragments.indices) createdFragments[position] else null } override fun getCount(): Int = totalTabs }
- 在宿主Fragment的
onResume(从表单页返回时会触发)中主动调用HomeFragment的刷新方法:
override fun onResume() { super.onResume() val homeFragment = (viewPager.adapter as? MyAdapter)?.getTabFragment(0) as? HomeFragment // 调用HomeFragment的刷新方法 homeFragment?.refreshHomeListData() }
可选优化
你当前的TabLayout和ViewPager绑定逻辑可以简化,不需要手动实现监听,直接调用系统方法即可:
// 替换原有addOnPageChangeListener和addOnTabSelectedListener的代码 tabLayout?.setupWithViewPager(viewPager)
内容的提问来源于stack exchange,提问作者DIGITAL JEDI
相关产品推荐
相关产品推荐

