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

导致的平滑过渡。

相关问题