繁体   English   中英

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

[英]Can I use setCurrentItem in viewPager and use 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"
我看到在我的AdaptergetItem之前调用了onPageSelected

有很简单的解决方法:

在您的适配器中写:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM