我可以在viewPager中使用setCurrentItem并使用onPageSelected吗?

时间:2012-08-22 09:40:51

标签: android android-fragments

我的问题是最初直接加载片段,我想调用方法片段对用户可见。

要加载正确的片段,我在viewPager.setCurrentItem()中使用onCreate。效果很好。

FragmentActivity code

public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    mTabsAdapter = new TabsPlayerAdapter(this, mRadioList);
    mMainViewPager.setAdapter(mTabsAdapter);
    mMainViewPager.setOnPageChangeListener(this);
    mMainViewPager.setCurrentItem(2);
}

对于一个名为fragment Current的方法,我使用onPageSelected viewPager。效果很好。

FragmentActivity code

@Override
public void onPageSelected(int position) {
    Log.d(TAG, "onPageSelected - position: " + position);
    ((PlayerFragment) mTabsAdapter.mSparseFragment.get(position))
                                  .startAnnimation();
}

FragmentStatePagerAdapter code:

@Override
public Fragment getItem(final int position) {
    Log.d(TAG, "getItem - position: " + position);
    Bundle args = new Bundle();  
        args.putString("num", mRadioModel.get(position).name);
        mSparseFragment.put(position, Fragment.instantiate  
                    (mContext,PlayerFragment.class.getName(), args));
        return mSparseFragment.get(position);
}

FragmentStatePagerAdapter code :

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    super.destroyItem(container, position, object);
    Log.d(TAG, "destroyItem - position: " + position);
    mSparseFragment.remove(position);
}

我可以分开做这两件事。但是当我尝试将两者结合使用时,当我调用"NullPointerException"时,我有一个fragment 我看到在onPageSelected getItem Adapter之前调用了{{1}}。

3 个答案:

答案 0 :(得分:2)

非常容易解决:

在适配器中写:

public static interface FirstShot
{
    public void onFirstShot();
}


private FirstShot firstShot;
private boolean shot = false;

@Override
public Fragment getItem(int arg0)
{
    if (!shot && firstShot != null)
    {
        shot = true;
        firstShot.onFirstShot();
    }

    // your code here
}

现在在活动中实施FirstShot:

@Override
public void onFirstShot()
{
    viewPager.post(new Runnable()
    {
        @Override
        public void run()
        {
            boolean needNotify = false;
            if (pager.getCurrentItem() == position) needNotify = true;
            viewPager.setCurrentItem(position, false);
            if (needNotify) onPageSelected(position);
        }
    });
}

onPageSelected()现在调用!

答案 1 :(得分:1)

当调用onAttachedToWindow时,您将知道项目可用。在您调用setCurrentItem时,尚未使用适配器创建视图。 (setAdapter不足以知道所有都被夸大了)

否则,您可以考虑在设置currentItem后设置侦听器,因此在打开片段时没有动画。

答案 2 :(得分:0)

已接受的解决方案对我没有用,因为我在getItem创建它之前仍然调用onPageSelected。

我这样修好了:

public class MyAdapter extends FragmentPagerAdapter {

    ...
    ...

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = createdFragments.get(position);
        if (fragment != null) {
            return fragment;
        }

        fragment = createNewFragment();
        createdFragments.put(position, fragment);

        return fragment;
    }

    public TabFragment getFragment(int position) {
        TabFragment fragment = createdFragments.get(position);
        if (fragment == null) {
            fragment = (TabFragment) getItem(position);
        }
        return fragment;
    }
}

然后我使用adapter.getFragment()按代码获取片段,永远不会得到空值。