选中指定Tab时如何刷新ViewPager中对应的SentAtt Fragment
选中指定Tab刷新ViewPager中对应SentAtt Fragment的实现方案
推荐方案:通过ViewPager Adapter存储并获取Fragment实例
这种方式稳定性最高,不会依赖系统内部的Tag规则,适配性强
- 先修改你的ViewPager适配器,新增存储Fragment实例和获取实例的方法:
class YourPagerAdapter(fm: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fm, lifecycle) { // 存储已创建的Fragment实例,业务简单直接存即可,对内存要求高可以替换为弱引用 private val fragmentCache = SparseArray<Fragment>() override fun getItemCount(): Int = 3 // 替换为你的实际Tab数量 override fun createFragment(position: Int): Fragment { val fragment = when(position) { 0 -> HomeFragment() 1 -> SentAtt() 2 -> OtherFragment() else -> Fragment() } // 创建时存入缓存 fragmentCache.put(position, fragment) return fragment } // 对外提供获取指定位置Fragment的方法 fun getFragmentByPosition(position: Int): Fragment? = fragmentCache.get(position) // 销毁Fragment时同步移除缓存,避免内存泄漏 override fun onDestroyItem(container: ViewGroup, position: Int, `object`: Any) { fragmentCache.remove(position) super.onDestroyItem(container, position, `object`) } }
如果是用旧版的FragmentPagerAdapter,逻辑完全一致,只需要把适配器继承类对应修改即可
- 给SentAtt Fragment新增公开的刷新方法,把你需要执行的刷新逻辑写在里面:
class SentAtt : Fragment() { // 你自己的业务刷新方法,比如重新拉取接口、更新列表UI等 fun refreshData() { // 这里写你的刷新逻辑 // 例:viewModel.fetchLatestSentAttData() } }
- 完善Tab选中监听里的调用逻辑:
tabLayout!!.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { viewPager.currentItem = tab.position if(tab.position == 1){ // 从适配器获取SentAtt实例,调用刷新方法 val sentAtt = (viewPager.adapter as? YourPagerAdapter)?.getFragmentByPosition(1) as? SentAtt sentAtt?.refreshData() } } override fun onTabUnselected(tab: TabLayout.Tab) {} override fun onTabReselected(tab: TabLayout.Tab) {} })
轻量方案:通过系统默认Fragment Tag获取实例
如果你不想修改适配器,可以用这个取巧方案,依赖ViewPager默认生成的Fragment Tag规则:
tabLayout!!.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab) { viewPager.currentItem = tab.position if(tab.position == 1){ // ViewPager默认生成的Tag格式:"android:switcher:ViewPagerID:位置" val fragmentTag = "android:switcher:${viewPager.id}:1" val sentAtt = supportFragmentManager.findFragmentByTag(fragmentTag) as? SentAtt sentAtt?.refreshData() } } override fun onTabUnselected(tab: TabLayout.Tab) {} override fun onTabReselected(tab: TabLayout.Tab) {} })
注意事项
- 两种方案都需要你提前在SentAtt里定义好公开的刷新方法,不要直接操作Fragment的内部控件,避免空指针
- 如果使用ViewPager2,两种方案都可以兼容,只需要适配适配器的对应方法即可
内容的提问来源于stack exchange,提问作者Kurik9797
相关产品推荐
相关产品推荐

