1

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

为了加载正确的片段,我使用viewPager.setCurrentItem()in 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);
}

对于一个名为片段 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.
我看到onPageSelectedgetItem我的Adapter.

4

3 回答 3

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

于 2012-09-09T20:06:30.053 回答
1

当调用 onAttachedToWindow 时,您将知道项目可用。在您调用 setCurrentItem 的那一刻,适配器尚未用于创建视图。(setAdapter 不足以知道所有都被膨胀了)

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

于 2012-08-22T09:56:59.863 回答
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()通过代码获取片段并且永远不会得到空值。

于 2015-07-08T08:17:46.783 回答