Changing pagetitle in Android Viewpager

intrepidkarthi picture intrepidkarthi · Dec 3, 2012 · Viewed 12.1k times · Source

I have a ViewPager in which I am using the getPageTitle method to get the title of the current page.

Here is the Adapter code:

    @Override
    public Fragment getItem(int i) {
        details = productData.get(i);
        Fragment fragment = new ProductViewFragment();
        Bundle args = new Bundle();
        args.putInt(ProductViewFragment.ARG_SECTION_NUMBER, i + 1);
        fragment.setArguments(args);
        return fragment;
    }

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

    public CharSequence getPageTitle(int position) 
    {
      return (position+1)+" of "+myData.size();
    }

Now I would like to update the page titles of the previous and next fragments. I want to name them as "previous" and "next". And it should be updated dynamically on subsequent pages also.

I am able to get the current page title number. For example, when I view the 5th fragment, the current fragment will show the title properly. And at both the corners of the ViewPager it shows the previous page title number on the left and next page title number on the right. Now, I want to have the page titles as "previous" on the left and "next" on the right, similar to the Gmail app and how it shows the mail count in the ViewPager.

The main thing I want to know is how can I access/modify the page title data of the next/previous fragments from the current fragment like they do in the Gmail app?

Answer

Matthieu picture Matthieu · Dec 6, 2012

I based this on the samples that come with the ViewPagerIndicator.

You basically listen for when the page changes and tell the adapter to display a different page title depending on the current position.

If you have those samples working and you just replace those two files, then try the sample Titles->Default and it works fine for me...

Changed the code for TestFragmentAdapter like this:

package com.viewpagerindicator.sample;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.viewpagerindicator.IconPagerAdapter;

class TestFragmentAdapter extends FragmentPagerAdapter implements IconPagerAdapter {
    protected static final String[] CONTENT = new String[] { "This", "Is", "A", "Test", };
    protected static final int[] ICONS = new int[] {
            R.drawable.perm_group_calendar,
            R.drawable.perm_group_camera,
            R.drawable.perm_group_device_alarms,
            R.drawable.perm_group_location
    };

    private int mCount = CONTENT.length;

    // CHANGE STARTS HERE
    private int current_position=0;

    public void set_current_position(int i) {
        current_position = i;
    }
    // CHANGE ENDS HERE

    public TestFragmentAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return TestFragment.newInstance(CONTENT[position % CONTENT.length]);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        // CHANGE STARTS HERE
        if (position == current_position-1) {
            return "Previous";
        } else if (position == current_position+1) {
            return "Next";
        }
        // CHANGE ENDS HERE
        return TestFragmentAdapter.CONTENT[position % CONTENT.length];
    }

    @Override
    public int getIconResId(int index) {
      return ICONS[index % ICONS.length];
    }

    public void setCount(int count) {
        if (count > 0 && count <= 10) {
            mCount = count;
            notifyDataSetChanged();
        }
    }
}

the code for SampleTitlesDefault looks like this (added the OnPageChangeListener)

package com.viewpagerindicator.sample;

import android.os.Bundle;
import android.support.v4.view.ViewPager;

import com.viewpagerindicator.TitlePageIndicator;

// CHANGE ADDED implements.... HERE
public class SampleTitlesDefault extends BaseSampleActivity implements ViewPager.OnPageChangeListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_titles);

        mAdapter = new TestFragmentAdapter(getSupportFragmentManager());

        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mIndicator = (TitlePageIndicator)findViewById(R.id.indicator);
        mIndicator.setViewPager(mPager);
        // CHANGE STARTS HERE
        mIndicator.setOnPageChangeListener(this);
        // CHANGE ENDS HERE
    }

    // CHANGE STARTS HERE
    @Override
    public void onPageScrolled(int i, float v, int i1) {
    }

    @Override
    public void onPageSelected(int i) {
        mPager = (ViewPager)findViewById(R.id.pager);
        ((TestFragmentAdapter)mPager.getAdapter()).set_current_position(i);
    }

    @Override
    public void onPageScrollStateChanged(int i) {
    }
    // CHANGE ENDS HERE
}