Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用FragmentPagerAdapter在viewpager中添加/删除片段_Android_Android Fragments_Android Viewpager_Fragmentpageradapter - Fatal编程技术网

Android 使用FragmentPagerAdapter在viewpager中添加/删除片段

Android 使用FragmentPagerAdapter在viewpager中添加/删除片段,android,android-fragments,android-viewpager,fragmentpageradapter,Android,Android Fragments,Android Viewpager,Fragmentpageradapter,我使用FragmentPagerAdapter最初加载4个片段。现在我有另一个片段,我只想在点击时显示,比如说从其他片段中的一个按钮,每次该片段被带到前面,新的数据应该在其中。那么现在我的逻辑应该是什么呢 我的碎片 定义我的适配器并将其添加到viewpager 现在出于某种原因,我不得不把setOffscreenPagilemit3放进去,因为我不想让我的其他碎片带回来时重新加载 谢谢。您应该更改此方法 @Override public int getCount() { return n

我使用FragmentPagerAdapter最初加载4个片段。现在我有另一个片段,我只想在点击时显示,比如说从其他片段中的一个按钮,每次该片段被带到前面,新的数据应该在其中。那么现在我的逻辑应该是什么呢

我的碎片

定义我的适配器并将其添加到viewpager

现在出于某种原因,我不得不把setOffscreenPagilemit3放进去,因为我不想让我的其他碎片带回来时重新加载


谢谢。

您应该更改此方法

@Override
public int getCount() {
    return numberOfFragmentsToShow;
}
numberOfFragmentsToShow是一个int变量,当您想要显示更多/更少的片段时,可以更改它

保留对SmallViewPagerAdapter实例的引用,并在链接片段数时,确保调用smallViewPagerAdapterInstance.notifyDataSetChanged;使更改生效


或者,您可以从片段的arraylist中添加/删除项,但必须调用smallViewPagerAdapterInstance.notifyDataSetChanged;查看更改。

我找到的解决方案是在初始化viewpager时添加我的5个片段

private ArrayList<Fragment> frags = new ArrayList<Fragment>();
private SmallViewPagerAdapter vpAdapter;
viewPager.setPagingEnabled(false);
viewPager.setOffscreenPageLimit(4);
frags.add(new MapContainerFragment(this));
frags.add(new FavoriteContainerFragment(this));
frags.add(new AllOffersFragment(this));
frags.add(new RegisterFragment(this));
frags.add(new DetailFragment(this));
vpAdapter = new SmallViewPagerAdapter(getSupportFragmentManager(),
                frags);
viewPager.setAdapter(vpAdapter);
然后单击按钮,我只需更改viewpager的当前选定页面


注:我知道这是一个糟糕的方法,但这就是我能想出的解决问题的办法。如果有人有更好的想法或认为这种方法不好,请告诉我。

在viewpager中动态添加或删除片段:

在“活动开始”时调用SetupViewPagerViewPagerViewPager。 要加载不同的片段,请调用setupViewPagerCustomviewPager:


首先感谢您的回复,其次,现在我已经在适配器public void addfragframent frag{allFragments.addfrag;notifyDataSetChanged;}中创建了一个函数,通过该函数我可以轻松添加片段,但问题是我无法通过调用此函数public void removeFrag来删除片段{allFragments.removeallFragments.size-1;notifyDataSetChanged;}你试过了吗?我试过了,我想问题是我用的是setOffscreenLimit4,它不允许我销毁和添加新的片段…我不能删除这个caz我不想让其他片段在回到前面时重新加载。我明天会检查我的代码,但我很确定我做了我告诉你的。我只是禁用了滑动通过返回比不满足某些条件时应返回的片段数量少的片段。我还在指示器中创建了一个自定义圆圈页面。这家伙也被同样的方式愚弄了,他绘制的圆圈数量比他应该绘制的要少。
@Override
public int getCount() {
    return numberOfFragmentsToShow;
}
private ArrayList<Fragment> frags = new ArrayList<Fragment>();
private SmallViewPagerAdapter vpAdapter;
viewPager.setPagingEnabled(false);
viewPager.setOffscreenPageLimit(4);
frags.add(new MapContainerFragment(this));
frags.add(new FavoriteContainerFragment(this));
frags.add(new AllOffersFragment(this));
frags.add(new RegisterFragment(this));
frags.add(new DetailFragment(this));
vpAdapter = new SmallViewPagerAdapter(getSupportFragmentManager(),
                frags);
viewPager.setAdapter(vpAdapter);
public static void updateView(Context context, String offerId) {

    offer = new DBHandler(context).getOffersById(offerId);
    if (offer != null) {

        offerName.setText(offer.getTitle());

        offerSave.setText(offer.getListTitle());
        ImageLoader.getInstance().displayImage(
                Constants.URLHelper.getUrlForOfferImage(offer.getId(),
                        offer.getLogoId()), offerImage);

        detailText.setText(Html.fromHtml(offer.getDetailDesc().replace(
                "COLOR=\"#0B333C\"", " ")));

    } else {
        Toast.makeText(context, "No Offer detail found!!",
                Toast.LENGTH_LONG).show();
    }
}
private void setupViewPager(ViewPager viewPager)
{
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new fragmnet1(), "HOME");
    adapter.addFrag(new fragmnet2(), "SERVICES");

    viewPager.setAdapter(adapter);
}

private void setupViewPagerCustom(ViewPager viewPager)
{

    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

    adapter.addFrag(new fragmnet3(), "Contact us");
    adapter.addFrag(new fragmnet4(), "ABOUT US");


    viewPager.setAdapter(adapter);
}

//Viewpageradapter, handles the views

static class ViewPagerAdapter extends FragmentStatePagerAdapter
{
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager){
        super(manager);
    }

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

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

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

    public void addFrag(Fragment fragment, String title){
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position){
        return mFragmentTitleList.get(position);
    }
}