我在使用FragmentStatePagerAdapter管理更改的项目列表时遇到了问题。请检查源这里。
问题是,当底层列表发生变化(我称之为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处的片段应该被删除。但是,适配器从未更新过片段在它自己的私有列表中的位置。因此,它仍然显示旧的、删除的数据。
我找到了这个答案,但这是一个黑客,它依赖于调用getItemPosition,然后强制片段更新其视图。
如何能够管理更改列表中的片段?
发布于 2014-12-02 00:04:14
根据ViewPager.dataSetChanged()源,它使用PagerAdapter.getItemPosition()来确定数据更改后项目的新位置。默认情况下,getItemPosition()总是返回不变,这意味着它永远不会破坏和重新创建已经创建的项。
如果要更新响应于getItemPosition()调用而存在的片段,则重写notifyDataSetChanged()返回正确的值。例如,总是返回无总是会销毁每个片段并从头开始重新创建它们(在大多数情况下,如果项目只是重新排序的话,这比需要做的工作更多)。
https://stackoverflow.com/questions/27239534
复制相似问题