gpt4 book ai didi

java - FragmentStatePagerAdapter 不处理更改

转载 作者:行者123 更新时间:2023-12-01 12:11:31 25 4
gpt4 key购买 nike

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

问题是,当底层列表更改时,并且我调用 notifyDataSetChanged,适配器不会重建其内部 fragment 列表。引用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 处的 fragment 应该被删除。然而,适配器从未更新过其自己的私有(private)列表中的 fragment 的位置。因此它仍然显示旧的、已删除的数据。

我找到了this answer但这是一种依赖于 getItemPosition 被调用然后强制 fragment 更新其 View 的 hack。

如何管理不断变化的列表中的 fragment ?

最佳答案

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

如果您想更新已存在的 Fragment 以响应 notifyDataSetChanged() 调用,请重写 getItemPosition() 以返回正确的值。例如,始终返回 POSITION_NONE总是会销毁每个 fragment 并从头开始重新创建它们(在大多数情况下,如果项目只是重新排序,这比需要完成的工作更多)。

关于java - FragmentStatePagerAdapter 不处理更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27239534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com