gpt4 book ai didi

android - 首次创建 viewpager 时显示特定页面

转载 作者:搜寻专家 更新时间:2023-11-01 09:03:03 25 4
gpt4 key购买 nike

我有一个包含 ViewPager 的 fragment .这ViewPagerPagerAdapter 支持使用 Cursor .光标由 LoaderCallbacks 管理.我在这里使用 v4 支持库。

我想要的是创建 fragment 并让 View 寻呼机显示指定的页面,而不是从第 0 页开始。

我知道 ViewPager有一个 setCurrentItem()方法,但当 ViewPager 时数据可能尚未加载被 build 。我需要的是监听数据集更改的适配器,如果这是第一个这样的更改,则调用 setCurrentItem()ViewPager .

然而 PagerAdapter类不导出 registerDataSetObserver()方法;它有 package而不是 public访问(至少在 v4 支持库中)。

我所做的,对我来说似乎很像 hack,如下所示:

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) 在创建分页器之前加载数据时设置当前页面。

我已经尝试处理上述两种情况,但我认为必须有一种使用观察者的更稳健(并且希望更简单)的替代方法。

最佳答案

等待 initLoader 直到寻呼机存在后,检查 bool 标志并仅在第一次调用 onLoadFinished 时执行 setCurrentItem:

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;
}
}
}

注意:此代码 fragment 采用 v13 支持库,但对于 v4 应该是相同的。

关于android - 首次创建 viewpager 时显示特定页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13815010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com