我有一个包含ViewPager
的片段。此ViewPager
由使用PagerAdapter
的{{1}}支持。游标由Cursor
管理。我在这里使用v4支持库。
我想要的是创建片段并让视图寻呼机显示指定的页面,而不是从第0页开始。
我知道LoaderCallbacks
有ViewPager
方法,但在创建setCurrentItem()
时可能尚未加载数据。我需要的是收听适配器以进行数据集更改,如果这是第一次这样的更改,请在ViewPager
上调用setCurrentItem()
。
但是ViewPager
类不会导出PagerAdapter
方法;它具有registerDataSetObserver()
而不是package
访问权限(至少在v4支持库中)。
我做了什么,而且看起来非常像是对我的攻击,如下:
public
将数据加载到适配器(在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
之间存在竞争条件。因此,当(a)寻呼机存在但第一次加载数据或(b)在创建寻呼机之前加载数据时,可以设置当前页面。
我试图处理上述两种情况,但我认为必须有一种使用观察者更强大(并且希望更简单)的替代方法。
答案 0 :(得分:3)
在寻呼机存在之前等待initLoader
,检查布尔标志,并且仅在第一次调用setCurrentItem
时执行onLoadFinished
:
class ItemPagerFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
private CursorPagerAdapter mAdapter;
private ViewPager mPager;
private int mInitialPageToShow;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@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);
mAdapter = new CursorPagerAdapter(getFragmentManager());
mPager.setAdapter(mAdapter);
return view;
}
@Override
public void onViewCreated(View view, Bundle saved) {
super.onViewCreated(view, saved);
...
getLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
mAdapter.swapCursor(cursor);
setInitialPageIfRequired();
}
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;
}
}
}
注意:此代码段假定为v13支持库,但对于v4应该是相同的。