PagerAdapter.notifyDataSetChanged不刷新片段

问题描述 投票:16回答:4

我的Activity包含ViewPager和它的定制Adapter延伸FragmentStatePagerAdapterViewPager包含3个片段

用于从ViewPager中删除片段的代码

MainActivity

public void deleteElement(){
    final int currentItem = mViewPager.getCurrentItem();
    mPagerAdapter.removeItem(currentItem);
    mPagerAdapter.notifyDataSetChanged();
}

CustomPagerAdapter

private ArrayList<Item> data;
public void removeItem(int index){
        data.remove(index);
}

删除中间Fragment(索引1)时:

  • 来自data我正在删除正确的item
  • 问题是我(我猜)Fragment 3在notifyDataSetChanged之后删除,当前的Fragment仍然是用户看到的片段,正在加载的数据来自SavedInstance

所以最终的结果是用户仍然看到他试图删除的Fragment相同,这对他来说有点糟糕。

想法?

android android-viewpager android-pageradapter
4个回答
27
投票

尝试添加此:

private class MyPagerAdapter extends FragmentStatePagerAdapter {

//... your existing code

    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }

}

4
投票

你别无选择,只能实施PagerAdapter#getItemPosition。查看ViewPager确定如何更新其位置的来源,在notifyDataSetChanged之后添加新片段或删除死片段。它不应该太难,你只需要访问传递的片段的状态,你还需要访问活动中的主状态,它保存你的订单。

它还需要您实现getItemId以返回每个片段的一致ID,因为它们可以重新排序。

这是我在ViewPager照片中处理它的方式。

    private inner class PhotoPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
    override fun getItem(position: Int): PhotoViewFragment {
        // getItem is called to instantiate the fragment for the given page.
        return PhotoViewFragment.newInstance(position, [email protected][position])
    }

    override fun getItemId(position: Int): Long {
        return [email protected][position].ID!!.hashCode().toLong()
    }

    override fun getItemPosition(`object`: Any): Int {
        val frag = `object` as PhotoViewFragment
        val idx = [email protected] { ph -> ph.ID == frag.dataBinding.photo.ID }
        return if (idx >= 0) idx else PagerAdapter.POSITION_NONE
    }

    override fun getCount(): Int {
        return [email protected]
    }
}

0
投票

您可以尝试使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。问题是,我也遇到过这个问题,它帮助了我。


0
投票

您必须先将适配器设置为null,然后再将其设置为:

int currentPosition = mViewPager.getCurrentItem();
mPagerAdapter.notifyDataSetChanged();
mViewPager.setAdapter(null);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setCurrentItem(currentPosition);
© www.soinside.com 2019 - 2024. All rights reserved.