调用notifyDataSetChanged时FragmentStateAdapter不调用createFragment

时间:2020-10-07 23:43:11

标签: android android-viewpager2 fragmentstateadapter

我正在使用ViewPager2FragmentStateAdapter

public class MyAdapter extends FragmentStateAdapter {

    public MyAdapter(@NonNull Fragment fragment) {
        super(fragment);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return MyFragment.newInstance(MyClass.func(position));
    }

    @Override
    public int getItemCount() {
        return MyClass.NUM;
    }

}

不幸的是,在适配器上调用notifyDataSetChanged()完全无效(调用notifyItemChanged(position)可以正常工作)。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

我今天注意到了这一点,并且在IssueTracker中为此here创建了一个错误报告。但是,对我来说,即使notifyItemChanged(position:)notifyItemRangeChanged(positionStart:itemCount:)方法的行为也不正确。

该错误似乎是因为FragmentStateAdapter.getItemId(position:)方法的默认实现是简单地返回传递给它的position。因此,在每次itemId调用之前和之后,每个position的{​​{1}}都是相同的,因此将不会重新创建FragmentStateAdapter.notifyDataSetChanged()

一个可能的解决方法是引入一个偏移量,该偏移量会在每次调用Fragment之后调整itemId的值,从而强制重新生成片段。请参见下面的notifyDataSetChanged()类中的init块,它有助于解决此问题; ViewPagerAdapter被注册在此块中,每当调用AdapterDataObserver时,该块都会收到回调。

notifyDataSetChanged()