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



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

为了加载正确的片段,我在onCreate中使用viewPager.setCurrentItem()。它运行良好。

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

我可以分别做这两件事。但当我尝试将两者结合使用时,当我调用fragment时,我会得到一个"NullPointerException"
我看到onPageSelected在我的Adapter中的getItem之前被调用。

有一个非常简单的解决方案:

在您的适配器中写下:

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()现在调用!

当调用onAttachedToWindow时,您就会知道项是可用的。在调用setCurrentItem时,适配器还没有用于创建视图。(setAdapter不足以知道所有已充气)

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

接受的解决方案对我不起作用,因为在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;
    }
}

然后我用CCD_ 13通过代码得到一个片段,从来没有得到空值。

最新更新