java - Android - 片段不直接更新彼此旁边的标签

Edw*_*aly 3 java android android-fragments android-tabs

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

我不明白的问题是,当我将标签布局更改为艺术家 - 流派 - 歌曲 - 专辑时,一切都运行得很好.看来这些选项卡只在他们查看单独的活动或片段时才更新,然后返回到应该进行更改的选项卡.我也知道用于刷新微调器的sql或方法不是问题,因为我也尝试将布局更改为Genre - Artist - Album - Song.在这种情况下,类型更新会成功反映在相册中,但是艺术家中的那些更新不会,直到我将两个标签移离相册.

很难解释清楚,并且如果需要我可以发布我的代码,但似乎问题与直接在彼此旁边的选项卡之间导航有关.

我还尝试在我的类型片段中扩充添加相册布局,然后在添加或删除类型时更新微调器.

这是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;
}
Run Code Online (Sandbox Code Playgroud)

然后在删除方法中:

// 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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我在一个不同的问题上遇到这个问题后终于找到了解决这个问题的方法.它没有更新和正常工作的原因是因为我使用带有片段的ViewPager作为我的选项卡适配器.ViewPager的默认设置是一次最多加载3个页面或片段.因此,如果用户从某个选项卡移开3个选项卡,则会删除原始选项卡,并在重新选择原始选项卡时再次调用onCreate.

要解决这个问题,我只需将此行添加到我的TabsAdapter类的构造函数中:

mViewPager.setOffscreenPageLimit(NUMBER_OF_TABS - 1);
Run Code Online (Sandbox Code Playgroud)

这最终解决了我遇到的问题,以及一些已经出现的问题.

Ven*_*dor 6

要解决这个问题,你必须了解它的ViewPager工作原理.

在ViewPager中设置适配器时,ex 4 Fragments.让我们把| A | B | C | D |


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

X --> Y
      |--> | A | B | C | D |
Run Code Online (Sandbox Code Playgroud)

呈现Y的视图时,即显示片段A,

          Y
        | A | B |
Run Code Online (Sandbox Code Playgroud)

同时片段B在管道中生成.


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

          Y
    | A | B | C |
Run Code Online (Sandbox Code Playgroud)

您在做出任何更改一个是被反映在渲染.


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

          Y
    | B | C | D |
Run Code Online (Sandbox Code Playgroud)


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

          Y
    | C | D |
Run Code Online (Sandbox Code Playgroud)


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

          Y
    | B | C | D |
Run Code Online (Sandbox Code Playgroud)

现在,具有改变反射时数据是在改变在第二个步骤是提供与可以在下一步骤中被看见.


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

          Y
    | A | B | C |
Run Code Online (Sandbox Code Playgroud)


ViewPager在两侧缓存相邻视图,除非通过移动到另一个活动或移动两个视图来强制重建/刷新视图,因此不会渲染对效果视图进行的任何更改是相邻屏幕.您遇到了相同的问题,这是ViewPager的默认行为.

将A,B,C,D与您的标签进行比较,要解决此问题,请动态查看Update ViewPager吗?

  • 确保你使用FragmentStatePagerAdapterFragmentPagerAdapter不是杀死碎片.