我在使用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并从头开始重新创建它们(在大多数情况下,这比完成项目重新排序需要做更多的工作)。