簡體   English   中英

如何立即在ViewPager PagerTitleStrip中設置標題

[英]How to set the titles in a ViewPager PagerTitleStrip instantly

我知道我可以重寫FragmentPagerAdaptergetPageTitle()方法:

@Override
public CharSequence getPageTitle(int position) {
    return "myTitle";
}

...但是我想更改為CursorLoader回調上的頁面標題:

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
            // How to set the page title here? I miss something like:
            //     mPagerTitleStrip.setTitle(1, "My Title");
            // or: mFragmentPagerAdapter.setTitle(1, "My Title");
}

FragmentPagerAdapter創建自己的setTitle方法。 這是一個例子:

FragmentPagerAdapter

public class PagerAdapter extends FragmentPagerAdapter {

    /** A @ {@link List} of each {@link Fragment} displayed */
    private final List<Fragment> mFragments = new ArrayList<Fragment>();
    /** The titles for the underlying {@link PagerTitleStrip} */
    private final List<String> mTitles = new ArrayList<String>();

    /**
     * Constructor for <code>PagerAdapter</code>
     * 
     * @param fm The {@link FragmentManager} to use
     */
    public PagerAdapter(FragmentManager fm) {
        super(fm);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int getCount() {
        return mFragments.size();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public CharSequence getPageTitle(int position) {
        return mTitles.get(position);
    }

    /**
     * Adds a new {@link Fragment} and title to the adapter
     * 
     * @param fragment The {@link Fragment} to add
     * @param title The title for the {@link Fragment}
     */
    public void add(Fragment fragment, String title) {
        mFragments.add(fragment);
        mTitles.add(title);
        notifyDataSetChanged();
    }

    /**
     * Removes each {@link Fragment} from the adapter
     */
    public void clear() {
        mFragments.clear();
        mTitles.clear();
        notifyDataSetChanged();
    }

}

LoaderCallback

private PagerAdapter mAdapter;


/**
 * {@inheritDoc}
 */
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    final Uri uri = Audio.Artists.EXTERNAL_CONTENT_URI;
    final String[] projection = new String[] {
            BaseColumns._ID, ArtistColumns.ARTIST
    };
    return new CursorLoader(this, uri, projection, null, null, null);
}

/**
 * {@inheritDoc}
 */
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    while (data != null && data.moveToNext()) {
        final String artist = data.getString(1);
        mAdapter.add(new DummyFragment(), artist);
    }
}

/**
 * {@inheritDoc}
 */
@Override
public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.clear();
}

我正在使用的DummyFragment只是FrameLayout

那是一種方式,另一種方式是使用Fragment.getArguments 像這樣:

FragmentPagerAdapter

/**
 * {@inheritDoc}
 */
@Override
public CharSequence getPageTitle(int position) {
    return getItem(position).getArguments().getString("your_key");
}

LoaderCallback

/**
 * {@inheritDoc}
 */
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    while (data != null && data.moveToNext()) {
        final String artist = data.getString(1);
        final Bundle args = new Bundle();
        args.putString("your_key", artist);
        final DummyFragment fragment = new DummyFragment();
        fragment.setArguments(args);
        mAdapter.add(fragment);
    }
}

所以,有一些,但是實際上您所需要的只是對PagerAdapter.getPageTitle某種回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM