显示指定的页面首次创建视图时,寻呼机(Showing specified page when vie

2019-08-03 20:45发布

我有一个包含一个片段ViewPager 。 这ViewPager由支持PagerAdapter一个使用Cursor 。 光标是由管理LoaderCallbacks 。 我使用的是V4支持库在这里。

我想是创建片段和有一个显示指定的页面,而不是0页开始的观点寻呼机。

我知道ViewPagersetCurrentItem()方法,但数据可能的时候还没有被加载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()方法),并创建ViewPageronCreateView()方法。 所以当前页面可以设置或者当(a)该寻呼机存在,但数据被加载首次或(b)在创建寻呼机之前的数据被加载。

我试图处理上述两种情况,但我想一定有使用观察家另一种方法是更强大的(希望简单)。

Answer 1:

等到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相同。



文章来源: Showing specified page when view pager is first created