2012-08-22 29 views
1

我的問題是最初直接加載片段,也想調用用戶可見的方法片段。我可以在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); 
} 

將方法稱爲片段電流,I使用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在我的AdaptergetItem之前被調用。

回答

1

當onAttachedToWindow被調用時,您會知道這些項目可用。在調用setCurrentItem的那一刻,適配器尚未用於創建視圖。 (setAdapter不足以知道,一切都被誇大)

否則,您可以考慮設置你的監聽器設置CURRENTITEM後,打開片段時,因此沒有一個動畫。

+0

謝謝。第二項是完美的。新的問題是,他們沒有annimation的第一個片段負載,因爲'onPageSelected'沒有觸發其第一次打開網頁... – user1238096

+1

這是一個錯誤的ViewPager「上pageSelected」不叫第一頁。請點擊此鏈接瞭解更多描述:http://code.google.com/p/android/issues/detail?編號= 27526 – karn

+0

謝謝卡恩。但我認爲有一個解決方案來解決問題:( – user1238096

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()現在調用!

0

接受的解決方案並不適用於我,因爲在getItem創建它們之前,我仍然在調用PageSelected。

我固定它,像這樣:

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()獲得通過代碼片段和從來沒有得到一個空值。

相關問題