3

我有一个 FragmentActivity,其中包含在选项卡布局中显示的四个片段。这些选项卡用于在我的数据库中添加或删除内容,并按以下顺序显示:艺术家 - 流派 - 专辑 - 歌曲。专辑选项卡包含数据库中所有艺术家和流派的微调器,这些微调器应随着艺术家或流派添加到各自的选项卡中而更新。这适用于艺术家选项卡;但是,当我在“流派”选项卡中添加或删除某些内容时,除非我将选项卡更改为“艺术家”,否则更改不会显示在“专辑”中,或者转到单独的 Activity 然后返回。

我不明白的问题是,当我将选项卡布局更改为艺术家 - 流派 - 歌曲 - 专辑时,一切正常。似乎选项卡仅在查看单独的活动或片段时才更新,然后返回到应该发生更改的选项卡。我也知道我用来刷新微调器的 sql 或方法没有问题,因为我也尝试将布局更改为流派 - 艺术家 - 专辑 - 歌曲。在这种情况下,流派更新已成功反映在专辑中,但艺术家中的更新不会,直到我将两个选项卡从专辑中移开。

很难比这更清楚地解释,如果需要,我可以发布我的代码,但似乎问题与直接在彼此相邻的选项卡之间导航有关。

我还尝试在我的流派片段中膨胀添加专辑布局,然后在我添加或删除流派时更新微调器。

这是 AddGenreFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View v = inflater.inflate(R.layout.add_genre_layout, container, false);
    addAlbum = inflater.inflate(R.layout.add_album_layout, container, false);
    spinGenre = (Spinner) addAlbum.findViewById(R.id.spinGenre);
    return v;
}

然后在删除方法中:

// Refresh the spinners in Add Album
ArrayList<String> genreList = dbh.getAllGenres();       // Return all the genres in the database
if (!genreList.isEmpty()) {
    // Set the genre drop down box to be populated by all genres in the database
    adapterGenre = new ArrayAdapter<String>(addAlbum.getContext(),
    android.R.layout.simple_spinner_dropdown_item, genreList);
    adapterGenre.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinGenre.setAdapter(adapterGenre);
}

编辑:

在另一个问题中偶然发现了这个问题后,我终于找到了解决方案。它没有更新和正常工作的原因是因为我正在为我的标签适配器使用带有片段的 ViewPager。ViewPager 的默认设置是一次最多加载 3 个页面或片段。因此,如果用户将 3 个选项卡从某个选项卡移开,则原始选项卡将被销毁,并且在重新选择原始选项卡时将再次调用 onCreate。

为了解决这个问题,我简单地将这一行添加到我的 TabsAdapter 类的构造函数中:

mViewPager.setOffscreenPageLimit(NUMBER_OF_TABS - 1);

这终于解决了我遇到的问题,以及更多的问题。

4

1 回答 1

6

要解决这个问题,您必须了解其ViewPager工作原理。

在 ViewPager 中设置适配器时,前 4 个片段。让我们打电话| 一个 | 乙| C | D |


从活动X导航到活动Y,其中 ViewPager 包含上述片段。

X --> Y
      |--> | A | B | C | D |

当 Y 的视图被渲染时,即显示了 Fragment A,

          Y
        | A | B |

同时在流水线中生成 片段B。


当您移动到片段B 时, C在管道中生成,A仍然存在。

          Y
    | A | B | C |

您在A中所做的任何更改都会反映在B中。


当您移动到片段C时,D在管道中生成,B仍然存在。A被杀

          Y
    | B | C | D |


当你移动到D 时,C被保留,B被杀死。

          Y
    | C | D |


当您现在回到C 时,会在第一次创建 B 时生成新填充的数据。

          Y
    | B | C | D |

现在,在第二步中更改A中的数据时必须反映的更改可用并且可以在下一步中看到。


当您现在回到B 时,会在第一次创建 A 时生成新的填充数据。

          Y
    | A | B | C |


ViewPager 缓存两侧的相邻视图,不会呈现任何影响视图相邻屏幕的更改,除非通过移动到另一个活动或将 2 个视图分开来强制重新创建/刷新视图。您正在经历同样的事情,这是 ViewPager 的默认行为。

将 A、B、C、D 与您的选项卡进行比较,以解决此问题,请查看动态更新 ViewPager?

  • 确保使用FragmentStatePagerAdapter而不是,FragmentPagerAdapter因为它不会杀死碎片。
于 2014-11-05T18:39:30.300 回答