android 调用notifyDataSetChanged时,FragmentStateAdapter未调用创建片段

nszi6y05  于 2023-03-06  发布在  Android
关注(0)|答案(2)|浏览(151)

我将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)工作正常)。
我该如何解决这个问题?

rsl1atfo

rsl1atfo1#

我已经在IssueTracker中为here创建了一个bug报告,但对我来说,即使是notifyItemChanged(position:)notifyItemRangeChanged(positionStart:itemCount:)方法也是错误的。
该错误是由于FragmentStateAdapter.getItemId(position:)方法的默认实现,该方法只返回传入的position。因此,每个positionitemIdFragmentStateAdapter.notifyDataSetChanged()调用前后都是相同的,因此不会重新创建任何Fragment
一种可能的解决方法是在FragmentStateAdapter实现中为每个页面分配一个唯一的ID,并在每次调用notifyDataSetChanged()方法时为每个页面分配一个新的ID。请参阅下面ViewPagerAdapter类中的init块,它有助于实现此解决方法:AdapterDataObserver对象注册在此init块中,以便每当调用notifyDataSetChanged()时,它都接收回调。

class ViewPagerAdapter(fragmentActivity: FragmentActivity) :
    FragmentStateAdapter(fragmentActivity) {

    private var counter = 0L
    private var itemIds: List<Long>

    init {
        itemIds = generateListOfItemIds()

        val adapterDataObserver = object : AdapterDataObserver() {

            override fun onChanged() {
                itemIds = generateListOfItemIds()
            }
        }

        registerAdapterDataObserver(adapterDataObserver)
    }

    override fun createFragment(position: Int): Fragment {
        return PageFragment.newInstance(position)
    }

    override fun getItemCount(): Int {
        return itemIds.size
    }

    override fun getItemId(position: Int): Long {
        return itemIds[position]
    }

    override fun containsItem(itemId: Long): Boolean {
        return itemIds.contains(itemId)
    }

    private fun generateListOfItemIds() = (1..5).map { counter++ }
}
wkftcu5l

wkftcu5l2#

在将Adapter()设置到您的视图页之前,请将viewPager.setSaveFromParentEnabled(false);

相关问题