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

时间:2015-05-03 21:38:40

标签: android android-fragments android-viewpager 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),因为我不希望我的其他片段在他们带回来时重新加载。

感谢。

3 个答案:

答案 0 :(得分:0)

你应该改变这个方法

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

numberOfFragmentsToShow是您想要显示更多/更少片段时更改的int变量

保留对SmallViewPagerAdapter实例的引用,当您链接片段数时,请务必致电smallViewPagerAdapterInstance.notifyDataSetChanged();以使更改生效。

或者,您可以添加/删除片段的arraylist中的项目,但是您必须调用smallViewPagerAdapterInstance.notifyDataSetChanged();才能看到更改。

答案 1 :(得分:0)

我找到的解决方案是在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的当前所选页面。

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

答案 2 :(得分:0)

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

  • 在活动开始时致电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);
    }
}