提问者:小点点

由于ViewPager2导致TabLayout损坏


我有一个<code>Tablayout</code>,其中包含两个选项卡(片段)Home和Contacts,使用<code>ViewPager2</code〕实现。每个片段中的数据(TabLayout Activity的每个onResume()上请求更新)。由于我必须调用adapter.notifyItemChanged(位置)要刷新片段,我必须重写FragmentStateAdpater中的getItemIdcontainsItem,如本节蓝色注释所述。

问题是,现在TabLayout被破坏了,如果我切换tab,那么前一个选项卡中展开的菜单仍然存在(例如,当从Conctacts切换时,搜索菜单项仍然存在),并且通过打印一些日志,我注意到它进入了一个循环。在不覆盖< code>getItemId和< code>containsItem的情况下,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: 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


共1个答案

匿名用户

在尝试了许多次我在这里找到的各种解决方案,并尝试了< code > androidx . view page 2:view page 2:1 . 1 . 0-beta 01 之后,我不得不使用< code>ViewPager和已弃用的< code > fragmentstatepageradar 重写我的代码,遵循这个解决方案。