0

我有一个Tablayout带有 2 个选项卡(片段)的主页和联系人,使用ViewPager2. 每个片段中的数据(在每个onResume()TabLayout Activity 上都请求更新)。由于我必须调用adapter.notifyItemChanged(position);以刷新片段,因此我必须按照本getItemId蓝色注释中的说明覆盖两者和containsItem我的数据。FragmentStateAdpater

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

        @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,因为片段是使用 object ( BusinessCard.newInstance(myContact);) 创建的,第二个是 list 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: ContactList{7e700e} (48ea6f92-44ca-4324-8079-325c865df43e tag=f1) at position 1
I/TEST: ContactList{7e700e} (48ea6f92-44ca-4324-8079-325c865df43e tag=f1) at position 1

在图片中,您可以将问题可视化。在 Home 片段中,不应出现搜索项菜单。从联系人切换回主页后,它仍然存在: 断开的选项卡布局

4

1 回答 1

0

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

于 2021-12-02T15:54:44.640 回答