4

我一直在試圖測試如何將所有這些東西混合在一起,我遇到了問題! 我只想使用ActionBar.Tab使用三個選項卡的應用程序。例如,這個標籤可以是電影類型動作,冒險和動畫,用戶可以滑過標籤,因此它將使用ViewPager,每個標籤將顯示該類型的電影列表。沒有必要有三個不同的片段類,因爲所有的選項卡將是一個簡單的列表相同的格式。 ,我有問題,因爲當我選擇第二選項卡中,使用onPageSelected的位置爲1,Android,如何混合ActionBar.Tab + View Pager + ListFragment

mViewPager = (ViewPager) findViewById(R.id.pager); 
mViewPager.setAdapter(mCollectionPagerAdapter); 
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
@Override 
    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 
}); 

這使得調用方法public片段的getItem(int i)以所述CollectionPagerAdapter類內部,但隨後i的值是2 NOT 1,因此它會調用值爲2 NOT 1的TabFragment類的createView,因此選項卡不會成功刷新。

任何幫助將非常感謝!

代碼來創建標籤時,

// For each of the sections in the app, add a tab to the action bar. 
for (int i = 0; i < mCollectionPagerAdapter.getCount(); i++) { 
     mActionBar.addTab(mActionBar.newTab() 
      .setText(mGenres.get(i).getName()) 
      .setTabListener(this)); 

     //Let's request the movies for the first three genres 
     new GetMoviesByGenre().execute(mGenres.get(i).getId());   
} 

當選擇了選項卡,

@Override 
public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction arg1) { 

//Let's update the dataset for the selected genre 
TabFragment fragment = 
     (TabFragment) getSupportFragmentManager().findFragmentByTag(
        "android:switcher:"+R.id.pager+":"+tab.getPosition()); 
    if(fragment != null) // could be null if not instantiated yet 
    { 
     if(fragment.getView() != null) 
     { 
      fragment.updateDisplay(tab.getPosition()); // do what updates are required 
     } 
    } 

    mViewPager.setCurrentItem(tab.getPosition()); 
} 

CollectionPageAdapter類

public class CollectionPagerAdapter extends FragmentPagerAdapter { 

final int NUM_ITEMS = 3; // number of tabs 

List<Fragment> fragments = new ArrayList<Fragment>(); 

public Fragment getItem(int pos) { 
    return fragments.get(pos); 
} 

public void addFragment(Fragment f) { 
    fragments.add(f); 
} 

public CollectionPagerAdapter(FragmentManager fm) { 
    super(fm); 

    //Let's add the fragments 
    for (int i=0;i<NUM_ITEMS;i++) 
    { 
     Fragment fragment = new TabFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(TabFragment.ARG_OBJECT, 0); 
     fragment.setArguments(args); 
     addFragment (fragment); 
    } 
} 

@Override 
public int getCount() { 
    return NUM_ITEMS; 
} 

}

TabFragment類

public class TabFragment extends ListFragment { 

public static final String ARG_OBJECT = "object"; 

private MoviesAdapter m_Adapter; 
private ArrayList <Movie> mMovies = new ArrayList<Movie>(); 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    // you only need to instantiate these the first time your fragment is 
    // created; then, the method above will do the rest 
    if (m_Adapter == null) { 
     m_Adapter = new MoviesAdapter(getActivity(), mMovies); 
    } 
    setListAdapter(m_Adapter); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 

    int position = getArguments().getInt(ARG_OBJECT); // to check is the right fragment 
    View rootView = inflater.inflate(R.layout.tabs, container, false); 
    return rootView; 
} 

public void updateDisplay (int type) 
{ 
    GlobalVars gv = (GlobalVars)getActivity().getApplicationContext(); 

    switch (type) 
    { 
     case 0: 
      mMovies = gv.getActionMovies(); 
      break; 
     case 1: 
      mMovies = gv.getAdventureMovies(); 
      break; 
     case 2: 
      mMovies = gv.getAnimationMovies(); 
      break; 
    } 

    m_Adapter.notifyDataSetChanged(); 
} 

}

我不什麼我做錯了,我想,這些片段弄亂,因爲當我按下第二個選項卡中,從第一個標籤數據被更新,等等在...

謝謝!

+0

好的我認爲選擇選項卡中的位置與視圖分頁器中的getView索引之間的索引更改是因爲視圖分頁器正在準備自己顯示下一頁。但我無法設法通知listfragment的適配器內容已更改。一個簡單的文本示例正在工作,但不包括涉及的列表。 – nirvik

回答

3

除了使用CollectionPageAdapter,我更改爲使用Android文檔ViewPager中顯示的TabsAdapter類,它工作正常!

public class TabsAdapter extends FragmentPagerAdapter 
    implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 
private final Context mContext; 
private final ActionBar mActionBar; 
private final ViewPager mViewPager; 
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

private final List<Fragment> fragments = new ArrayList<Fragment>(); 

static final class TabInfo { 
    private final Class<?> clss; 
    private final Bundle args; 

    TabInfo(Class<?> _class, Bundle _args) { 
     clss = _class; 
     args = _args; 
    } 
} 

public TabsAdapter(FragmentActivity activity, ViewPager pager) { 
    super(activity.getSupportFragmentManager()); 
    mContext = activity; 
    mActionBar = activity.getActionBar(); 
    mViewPager = pager; 
    mViewPager.setAdapter(this); 
    mViewPager.setOnPageChangeListener(this); 
} 

public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 
    TabInfo info = new TabInfo(clss, args); 
    tab.setTag(info); 
    tab.setTabListener(this); 
    mTabs.add(info); 
    mActionBar.addTab(tab); 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    return mTabs.size(); 
} 

@Override 
public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

@Override 
public Fragment getItem(int position) { 

    TabInfo info = mTabs.get(position); 
    Fragment fr = Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    //addFragment (fr, position); 
    return fr; 

} 

public void addFragment(Fragment f, int location) { 

    if (fragments.size() == 0) 
     fragments.add(f); 
    else 
     fragments.add(location, f); 
    } 

@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
} 

@Override 
public void onPageSelected(int position) { 
    mActionBar.setSelectedNavigationItem(position); 
} 

@Override 
public void onPageScrollStateChanged(int state) { 
} 

@Override 
public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) { 
    Object tag = tab.getTag(); 
    for (int i=0; i<mTabs.size(); i++) { 
     if (mTabs.get(i) == tag) { 
      updateDatasetMovies (i); 
      mViewPager.setCurrentItem(i); 
     } 
    } 
} 



@Override 
public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) { 
    // TODO Auto-generated method stub 

} 


public void updateDatasetMovies (int pos) 
{ 
    //Let's update the dataset for the selected genre 
    TabFragment fragment = 
      (TabFragment) ((FragmentActivity)mContext).getSupportFragmentManager().findFragmentByTag(
         "android:switcher:"+R.id.pager+":"+pos); 

    //TabFragment fragment = (TabFragment) getItem(pos); 
    if(fragment != null) // could be null if not instantiated yet 
     { 
     if(fragment.getView() != null) 
     { 
      // no need to call if fragment's onDestroyView() 
      //has since been called. 
      fragment.updateDisplay(pos); // do what updates are required 
     } 
     } 

} 

}`

+0

我有類似於你的代碼。你有什麼代碼可以分享你如何改變它來使用TabAdapters類。我試過了,但遇到了一些問題。 –

+0

對不起,我沒有看過這段代碼很長一段時間,所以我不記得我改變了:(我會添加一個答案我的TabsAdapter代碼。 – nirvik

+0

感謝您的回覆。它實際上已經算出來了,我走了TabAdapter的路,所有東西看起來都好多了,但仍然遇到了一些重新加載標籤的問題,但是會發現它。 –

0

您可以嘗試在您的FragmentPagerAdapter中包含以下代碼,看看是否解決了問題。

public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

您也可以嘗試使用FragmentStatePagerAdapter

+1

謝謝,如果我使用getItemPosition,那麼我無法訪問每個片段來通知這個適配器的內容發生了變化,TabFragment fragment = (TabFragment)getSupportFragmentManager()。findFragmentByTag( 「機器人:切換器: 「+ R.id.pager +」:「+ tab.getPosition()); 無論如何,我使用[ViewPager](http://developer.android.com/reference/android/support/v4/view/ViewPager.html)的Android文檔中顯示的TabsAdapter類更改了所有代碼,並突然使用! – nirvik

1

我同意這個nirvik,但有應作出一個cruciual改善。這個implementation有一個缺陷 - 在滑動到下一個片段時,會調用onPageSelected方法,然後通過調用mActionBar.setSelectedNavigationItem(position);來調用onTabSelected方法。這會導致動畫閃爍。 此:

viewPager.setCurrentItem(i); 

應該由此被替換:

if(i != viewPager.getCurrentItem()) { 
    viewPager.setCurrentItem(i); 
} 

導致的平滑過渡。

相關問題