由于 ViewPager2 导致 TabLayout 损坏

Posted

技术标签:

【中文标题】由于 ViewPager2 导致 TabLayout 损坏【英文标题】:Broken TabLayout due to ViewPager2 【发布时间】:2022-01-07 09:26:10 【问题描述】:

我有一个Tablayout,带有 2 个选项卡(片段)主页和联系人,使用 aViewPager2 实现。每个片段中的数据(TabLayout Activity 的每个onResume() 都请求更新)。由于我必须调用adapter.notifyItemChanged(position); 来刷新片段,所以我必须在@987654330 中覆盖getItemIdcontainsItem @ 如section 中的蓝色注释中所述。

问题是现在 TabLayout 坏了,如果我切换选项卡,那么在前一个选项卡中膨胀的菜单仍然存在(例如,从联系人切换时搜索菜单项仍然存在)并且通过打印一些日志我注意到它去了在一个循环中。在不覆盖getItemIdcontainsItem 的情况下,tablayout 可以正常工作,但更新时不会刷新数据。

        @Override
        public long getItemId(int position) 
            String tag = "f" + position;
            if (fragmentManager.findFragmentByTag(tag) != null) 
                Log.i("TEST", fragmentManager.findFragmentByTag(tag).toString() + " at position " + position);
                return (long) fragmentManager.findFragmentByTag(tag).hashCode();
            
            return super.getItemId(position);
        

        @Override
        public boolean containsItem(long itemId) 
            Log.i("TEST", "Here is " + itemId);
            Log.i("TEST", "Here is " + fragmentManager.getFragments().stream().anyMatch(fragment -> (long) fragment.hashCode() == itemId));
            //return super.containsItem(itemId);
            return fragmentManager.getFragments().stream().anyMatch(fragment -> fragment.hashCode() == itemId);
        

也许获取片段的哈希值不是唯一 ID,因为片段是使用对象 (BusinessCard.newInstance(myContact);) 创建的,第二个是使用列表 ContactList.newInstance(listContacts); 创建的。

任何帮助都会非常有用,因为我完全迷路了。

非常感谢!

编辑:

如果我切换到“联系人”选项卡,它会开始循环播放。日志:

I/TEST: Here is 1
I/TEST: Here is false
I/TEST: Here is 1
I/TEST: Here is false
I/TEST: ContactList7e700e (48ea6f92-44ca-4324-8079-325c865df43e tag=f1) at position 1
I/TEST: ContactList7e700e (48ea6f92-44ca-4324-8079-325c865df43e tag=f1) at position 1

在图片中,您可以将问题形象化。在 Home 片段中,不应出现搜索项菜单。从联系人切换回主页后,它仍然存在:

【问题讨论】:

【参考方案1】:

在尝试了很多次后,我在这里找到了各种解决方案,并尝试了androidx.viewpager2:viewpager2:1.1.0-beta01,我不得不使用ViewPager 和已弃用的FragmentStatePagerAdapter 重写我的代码,遵循this 解决方案。

【讨论】:

你能检查一下这个issue

以上是关于由于 ViewPager2 导致 TabLayout 损坏的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager2嵌套RecyclerView滑动冲突解决办法

为啥Android ViewPager2 类是final?

新增我的推荐歌单通过ViewPager2+RadioGroup重构主界面( 简易音乐 六)

Android ViewPager与Fragment联动

Android ViewPager与Fragment联动

移除 ViewPager2 Overscroll 动画