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

时间:2012-12-11 06:46:04

标签: android android-viewpager android-cursorloader android-pageradapter

我有一个包含ViewPager的片段。此ViewPager由使用PagerAdapter的{​​{1}}支持。游标由Cursor管理。我在这里使用v4支持库。

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

我知道LoaderCallbacksViewPager方法,但在创建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)在创建寻呼机之前加载数据时,可以设置当前页面。

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

1 个答案:

答案 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应该是相同的。