Отображение указанной страницы при первом просмотре пейджера

У меня есть фрагмент, который содержит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() метод. Таким образом, текущая страница может быть установлена либо когда (а) пейджер существует, но данные загружаются в первый раз, либо (б) данные загружаются до того, как пейджер создан.

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

Ответы на вопрос(1)

Ваш ответ на вопрос