FragmentStatePagerAdapter不处理更改

时间:2014-12-01 23:52:16

标签: java android android-fragments android-viewpager fragmentstatepageradapter

我在使用FragmentStatePagerAdapter管理更改项目列表时遇到问题。请查看来源here

问题在于,当基础列表发生更改并且我调用notifyDataSetChanged时,适配器不会重建它的内部片段列表。参考instantiateItem中的代码:

@Override
public Object instantiateItem(ViewGroup container, int position) {
    // If we already have this item instantiated, there is nothing
    // to do.  This can happen when we are restoring the entire pager
    // from its saved state, where the fragment manager has already
    // taken care of restoring the fragments we previously had instantiated.
    if (mFragments.size() > position) {
        Fragment f = mFragments.get(position);
        if (f != null) {
            return f;
        }
    }

我认为此评论中的代码是错误的!如果我删除列表中位置0处的项目,并且我调用notifyDataSetChanged,则应删除位置0处的片段。但是,适配器从未在其自己的私有列表中更新片段的位置。因此,它仍然显示旧的,已删除的数据。

我发现this answer但是它是一个黑客,它依赖于调用getItemPosition,然后强制片段更新它的视图。

如何在更改列表中管理片段?

1 个答案:

答案 0 :(得分:1)

根据ViewPager.dataSetChanged() source,它使用PagerAdapter.getItemPosition()来确定数据更改后项目的新位置。默认情况下,getItemPosition()始终返回POSITION_UNCHANGED,这意味着它永远不会销毁并重新创建已创建的项目。

如果要更新已响应getItemPosition()调用而存在的片段,请覆盖notifyDataSetChanged()以返回正确的值。例如,始终返回POSITION_NONE将始终销毁每个片段并从头开始重新创建它们(在大多数情况下,如果项目只是重新排序,则需要完成的工作量更多)。