Search code examples
androidandroid-fragmentsandroid-viewpagerfragmentpageradapter

add/remove fragment in viewpager using FragmentPagerAdapter


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.


Solution

  • 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.