Отображение указанной страницы при первом просмотре пейджера
У меня есть фрагмент, который содержитViewPager
, ЭтотViewPager
поддерживаетсяPagerAdapter
который используетCursor
, Курсор управляетсяLoaderCallbacks
, Я использую библиотеки поддержки v4 здесь.
Я хочу создать фрагмент и иметь пейджер вида, показывающий указанную страницу, а не начиная со страницы 0.
я знаю этоViewPager
имеетsetCurrentItem()
метод, но данные еще не могут быть загружены, когдаViewPager
создано. Что мне нужно, это прослушать адаптер для изменений набора данных, и если это первое такое изменение, то вызовитеsetCurrentItem()
наViewPager
.
ОднакоPagerAdapter
класс не экспортируетregisterDataSetObserver()
Способ; в нем естьpackage
скорее, чемpublic
доступ (по крайней мере, в библиотеке поддержки v4).
То, что я сделал, и мне кажется, что это очень похоже на взлом, заключается в следующем:
class ItemPagerFragment extends SherlockFragment implements LoaderCallbacks<Cursor> {
private CursorPagerAdapter mAdapter;
private ViewPager mPager;
private int mInitialPageToShow;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAdapter = new CursorPagerAdapter() {
@Override public void notifyDataSetChanged() {
super.notifyDataSetChanged();
setInitialPageIfRequired();
}
};
getActivity().getSupportLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) {
View view = inflater.inflate(R.layout.items_pager, group, false);
mPager = (ViewPager) view.findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
setInitialPageIfRequired();
return view;
}
private boolean initialPageSet = false;
private synchronized void setInitialPageIfRequired() {
// Set the current page of the pager if (a) this is the
// first time attempting to set the page and (b) the
// pager exists and (c) the adapter has data.
if (!initialPageSet && mPager != null && mAdapter.getCount() > 0) {
mPager.setCurrentItem(mInitialPageToShow);
initialPageSet = true;
}
}
}
Между загрузкой данных в адаптер (вonCreate()
метод), и созданиеViewPager
вonCreateView()
метод. Таким образом, текущая страница может быть установлена либо когда (а) пейджер существует, но данные загружаются в первый раз, либо (б) данные загружаются до того, как пейджер создан.
Я пытался рассмотреть оба вышеупомянутых случая, но я думаю, что должен быть альтернативный подход, который был бы более надежным (и, надеюсь, более простым) с использованием наблюдателей.