【问题标题】:How to replace a fragment in a FragmentStateAdapter如何替换 FragmentStateAdapter 中的片段
【发布时间】:2021-09-01 11:15:13
【问题描述】:

我有一个“主”片段,其中包含侧面的选项卡,当我单击任何这些选项卡时,“主”片段的 ViewPager2 会跳转到特定片段(每个片段属于不同的类) FragmentStateAdapter。

假设对于其中一个片段,它有一个按钮,如果按下该按钮,它将替换 FragmentStateAdapter 中的当前片段,但选项卡仍在旁边(我们仍在“主”片段中)。如果我单击任何选项卡,我希望它像以前一样在特定片段中工作。

我想这样做,但我不确定该怎么做,或者它是否是正确的方法。我应该替换 FragmentStateAdapter 中的片段之一,还是应该完全销毁 ViewPager2 并用所需的片段替换它?还是有更好的方法?

这就是 FragmentStateAdapter 的样子,我想在点击其中的按钮时用不同的片段替换 EscortFragment。

public class HomeTabAdapter extends FragmentStateAdapter {
    private ArrayList<Fragment> fragments;
    private Context context;

    public HomeTabAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, Context context) {
        super(fragmentManager, lifecycle);
        this.context = context;
        fragments = new ArrayList<>();
        fragments.add(new HomeFragment());
        fragments.add(new PurposeOfVisitFragment());
        fragments.add(new GalleryFragment());
        fragments.add(new EscortFragment());
        fragments.add(new MapsFragment());
        fragments.add(new FaqFragment());
        fragments.add(new SupportFragment());
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragments.get(position);
    }

    @Override
    public int getItemCount() {
        return fragments.size();
    }
}

【问题讨论】:

    标签: android android-fragments android-viewpager2 fragmentstateadapter


    【解决方案1】:

    简而言之,在您的 HomeTabAdapter 类中覆盖 getItemId() 以为您的每个片段生成唯一的 ID 值。下次基类FragmentStateAdapter 需要访问片段时,它将看到该位置的不同 ID 值。这将导致它再次为该职位调用createFragment()

    如果你覆盖getItemId(),你也必须覆盖containsItem()

    因此,例如,将以下内容添加到您的 HomeTabAdapter 类中:

    @Override
    public long getItemId(int position) {
        Fragment fragment = fragments.get(position);
        long id = getIDForFragment(fragment);
        return id;
    }
    
    @Override
    public boolean containsItem(long itemId) {
        for (Fragment fragment : fragments) {
            if (getIDForFragment(fragment) == itemId)
                return true;
        }
        return false;
    }
    
    private long getIDForFragment(Fragment fragment)
    {
        // Insert code that generates a unique ID value for each Fragment here.
    }
    
    public void replaceFragment(int index, Fragment fragment) {
        fragments.set(index, fragment);
        notifyDataSetChanged();
    }
    

    注意replaceFragment() 方法调用notifyDataSetChanged()。这会强制立即检查 ID 值,而不是等到稍后的时间。

    【讨论】:

    • 这实际上是我需要的,因为我在数组列表中使用了 .set()。
    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多