我在使用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的调用,然后强制片段更新其视图。

如何管理变更列表中的片段?

最佳答案

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

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

10-07 19:46