を含むフラグメントがありますViewPager
。これViewPager
は、PagerAdapter
を使用するによってサポートされていますCursor
。カーソルは によって管理されLoaderCallbacks
ます。ここでは v4 サポート ライブラリを使用しています。
私が望むのは、フラグメントを作成し、ページ 0 から開始するのではなく、ビュー ページャーに指定したページを表示させることです。
ViewPager
メソッドがあることは知ってsetCurrentItem()
いますが、 が作成されたときにデータがまだロードされていない可能性がありますViewPager
。必要なのは、データ セットの変更についてアダプターをリッスンすることです。それが最初の変更である場合は、setCurrentItem()
onを呼び出します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()
作成の間に競合状態があります。したがって、現在のページは、(a) ページャーが存在するがデータが初めてロードされる場合、または (b) ページャーが作成される前にデータがロードされる場合に設定できます。ViewPager
onCreateView()
上記の両方のケースを処理しようとしましたが、オブザーバーを使用して、より堅牢な (できればより単純な) 代替アプローチが必要であると考えています。