add/remove viewpager 中的片段使用 FragmentPagerAdapter

add/remove fragment in viewpager using FragmentPagerAdapter

我最初使用 FragmentPagerAdapter 加载 4 个片段。现在我有另一个片段,我只想在执行点击时显示(比如从其他片段内的按钮),并且每次将该片段带到前面时,新数据应该在其中。那么现在我这样做的逻辑应该是什么?

我的 FragmentPagerAdapater

public class SmallViewPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> allFragments;

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

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

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

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

private ArrayList<Fragment> frags = new ArrayList<Fragment>();
private SmallViewPagerAdapter vpAdapter;
viewPager.setPagingEnabled(false);
viewPager.setOffscreenPageLimit(3);
frags.add(new MapContainerFragment(this));
frags.add(new FavoriteContainerFragment(this));
frags.add(new AllOffersFragment(this));
frags.add(new RegisterFragment(this));
vpAdapter = new SmallViewPagerAdapter(getSupportFragmentManager(),
                frags);
viewPager.setAdapter(vpAdapter);

现在出于某种原因我必须设置 setOffscreenPageLimit(3) 因为我不希望我的其他片段在它们带回来时重新加载。

谢谢。

你应该改变这个方法

@Override
public int getCount() {
    return numberOfFragmentsToShow;
}

numberOfFragmentsToShow 是一个 int 变量,当你想显示 more/less 片段时你可以更改

保留对 SmallViewPagerAdapter 实例的引用,当您链接多个片段时,请确保调用 smallViewPagerAdapterInstance.notifyDataSetChanged(); 以使更改生效。

或者您可以是片段数组列表中的 adding/removing 项,但您必须调用 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);

并创建了一个静态函数,用于在每次点击时更新视图

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();
    }
}

然后单击按钮,我只是更改了 viewpager 的当前选定页面。

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

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

  • 在 activity 开始时调用 setupViewPager(viewPager)

要加载不同的片段,请调用 setupViewPagerCustom(viewPager):

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);
    }
}