2013-10-26 2 views
0

Я знаю, что я могу переопределить getPageTitle() метод FragmentPagerAdapter:Как установить заголовки в ViewPager PagerTitleStrip мгновенно

@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"); 
} 
+1

В хакерской попытке вы можете просто ссылаться на 'PagerTitleStrip' и перебирать его дочерние элементы (это должно быть 3) и отбрасывать их в« TextViews »и напрямую устанавливать текст. Почему вы хотите установить заголовки так быстро? – Luksprog

+0

Я выполняю мгновенный поиск и показываю количество результатов поиска, отображаемых на каждом фрагменте как часть его названия. – cody

ответ

1

Создайте свой собственный setTitle метод в вашем FragmentPagerAdapter. Вот пример:

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.

+0

Спасибо за ваш быстрый ответ. Но это было не то, что я искал, может быть, я был недостаточно ясен ... моя проблема в том, что названия обновляются, когда вызывается getPageTitle (int position), и это слишком поздно. Мне нужно установить название действительно МГНОВЕННО. – cody

+0

Любое другое предложение? – cody

Смежные вопросы