1

我有一个“主”片段,其中包含侧面的选项卡,当我单击任何这些选项卡时,“主”片段的 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();
    }
}
4

1 回答 1

2

简而言之,在你的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 值,而不是等到稍后的时间。

于 2021-09-07T23:05:27.610 回答