替换Viewpager中的片段(notifyDataSetChanged不起作用)

时间:2015-06-30 10:17:26

标签: android android-fragments android-viewpager notifydatasetchanged fragmentstatepageradapter

我的MainActivity包含一个viewPager。

在MainActivity.java中,我为viewpager设置了适配器。适配器扩展FragmentStatePagerAdapter。我要替换的片段是 cameraFragment。因此,当用户点击切换摄像头按钮时,我想现在显示摄像头片段,这次是打开前置摄像头。

单击“切换相机”按钮时,我会从传递给自定义适配器的片段的arraylist中删除片段。我添加新片段并调用notifydatasetchanged。但是,这不会导致添加新片段。如何在一个自定义片段状态寻呼机适配器支持的viewpager中实现动态替换片段? 代码:

mainPageFragments = new ArrayList<>();
mainPageFragments.add(new ResultsFragment_());
mainPageFragments.add(DemoCameraFragment_.newInstance(false));
pagerAdapter = new MainViewPagerAdapter(getSupportFragmentManager(),mainPageFragments);

替换片段:收到我做的相关事件后,

mainPageFragments.remove(1);
    if (event.getCameraState().equals(CameraSwitchButton.CameraTypeEnum.BACK)) {
        mainPageFragments.add(DemoCameraFragment.newInstance(false));
    } else {
        mainPageFragments.add(DemoCameraFragment.newInstance(true));

    }
    // Not Working...
    pagerAdapter.notifyDataSetChanged();

适配器代码:

public class MainViewPagerAdapter extends FragmentStatePagerAdapter {

ArrayList<Fragment> fragmentsArray;

public MainViewPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragmentsArray) {
    super(fm);
    this.fragmentsArray = fragmentsArray;
}

@Override
public Fragment getItem(int position) {
    return fragmentsArray.get(position);
}

@Override
public int getCount() {
    return fragmentsArray.size();
}

@Override
public int getItemPosition(Object object) {
    return super.getItemPosition(object);
}
}

2 个答案:

答案 0 :(得分:2)

Your MainViewPagerAdapter.getItemPosition is the cause of your issue.

Default implementation always returns POSITION_UNCHANGED. For pager to remove your fragment you have to return PagerAdapter.POSITION_NONE for the fragments that are removed.

Additionally your current design contradicts with the idea of FragmentStatePagerAdapter. From the FragmentStatePagerAdapter documentation: "This version of the pager is more useful when there are a large number of pages, working more like a list view. When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment. This allows the pager to hold on to much less memory associated with each visited page as compared to FragmentPagerAdapter at the cost of potentially more overhead when switching between pages."

Your current implementation holds all fragments in an array, and so defeats this mechanism. Correct implementation would be to create fragments in MainViewPagerAdapter.getItem method and let the adapter to handle fragments lifecycles as needed.

答案 1 :(得分:0)

感谢@Okas。我在FragmentStatePagerAdapter子类中对getItemPosition进行了以下更改。

@Override
 public int getItemPosition(Object object) {
    if (object instanceof DemoCameraFragment_)
        return POSITION_NONE;
    return super.getItemPosition(object);
}

我将日志添加到我的两个片段的OnCreate中,以确认它们是否正在重新创建。根据我的要求,只重新创建第二个片段。