1

I'm using FragmentPagerAdapter to load 4 fragments initially. Now i have another fragment which i want to show only when a click is performed (let say from a button inside other fragments) , and every time that fragment is bring to front, new data of should be in it. So now what should be my logic to do this?

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

Defining my adapter and adding it to 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);

Now for some reason i have to put setOffscreenPageLimit(3) because i dont want my other fragments to reload when ever they brought back.

Thanks.

awaistoor
  • 786
  • 2
  • 11
  • 36

3 Answers3

0

you should change this method

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

numberOfFragmentsToShow is an int variable you change when you want to show more/less fragments

keep a reference to an instance of SmallViewPagerAdapter and when you are chaining the number of fragments, make sure you call smallViewPagerAdapterInstance.notifyDataSetChanged(); for the changes to take effect.

Alternately you could be adding/removing items from the arraylist of fragments, but you must call smallViewPagerAdapterInstance.notifyDataSetChanged(); to see the changes.

Bojan Kseneman
  • 15,488
  • 2
  • 54
  • 59
  • firstly thanks for reply, secondly, for now i have created a function in my adapter `public void addFrag(Fragment frag) { allFragments.add(frag); notifyDataSetChanged(); }` by which i can add a fragment easily but the problem is i cant remove the fragment by calling this function `public void removeFrag() { allFragments.remove(allFragments.size() - 1); notifyDataSetChanged(); }` – awaistoor May 03 '15 at 22:27
  • Have you tried this http://stackoverflow.com/questions/10396321/remove-fragment-page-from-viewpager-in-android – Bojan Kseneman May 04 '15 at 15:07
  • i have, i think the problem is that i am using `setOffscreenLimit(4)` which isnt letting me destroy and add new fragment ... and i cant remove this caz i dont want other fragments to reload when they brought back to front. – awaistoor May 04 '15 at 15:52
  • I will check my code tomorrow, but I am pretty sure I did what I have told you. I was only disabling the swipe by returning a lower number of fragments than it should have been if some conditions were not met. I have also made a custom circle page inidicator. That guy was also fooled in the same way, he was drawing a lower number of circles than he should. – Bojan Kseneman May 04 '15 at 16:01
0

Well the solution i have found for this is to add my 5 fragments on initialization of viewpager

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

and created a static function for updating the view on every click

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

and on the button click i just change the current selected page of the viewpager.

NOTE: I know its a bad approach but that's all I can come up for the solution to my problem. If someone have a better idea or thinks that this approach isn't better, please tell me.

awaistoor
  • 786
  • 2
  • 11
  • 36
0

Add or remove fragment in viewpager dynamically:

  • Call setupViewPager(viewPager) on activity start.

To load a different fragment, call 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);
    }
}
Nander Speerstra
  • 1,496
  • 6
  • 24
  • 29