我在使用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,然后强制片段更新它的视图。
如何在更改列表中管理片段?
答案 0 :(得分:1)
根据ViewPager.dataSetChanged() source,它使用PagerAdapter.getItemPosition()来确定数据更改后项目的新位置。默认情况下,getItemPosition()
始终返回POSITION_UNCHANGED,这意味着它永远不会销毁并重新创建已创建的项目。
如果要更新已响应getItemPosition()
调用而存在的片段,请覆盖notifyDataSetChanged()
以返回正确的值。例如,始终返回POSITION_NONE将始终销毁每个片段并从头开始重新创建它们(在大多数情况下,如果项目只是重新排序,则需要完成的工作量更多)。