我有一个包含一个片段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()
方法。 所以当前页面可以设置或者当(a)该寻呼机存在,但数据被加载首次或(b)在创建寻呼机之前的数据被加载。
我试图处理上述两种情况,但我想一定有使用观察家另一种方法是更强大的(希望简单)。