Android, Comment mélanger ActionBar.Tab + Vue Pager + ListFragment
J'ai essayé de tester la façon de mélanger toutes ces choses ensemble, et je vais avoir des problèmes!!
J'ai juste envie d'une application avec trois onglets à l'aide de l'ActionBar.Onglet. Par exemple, ces onglets peuvent être des films de genres d'Action, d'Aventure et d'Animation, l'utilisateur peut parcourir les onglets, donc il va utiliser le ViewPager et chaque onglet affiche une liste des films de ce genre. Il n'y a pas besoin d'avoir trois différents fragments classes parce que tous les onglets sera le même format d'une simple liste.
Et je vais avoir des problèmes parce que quand je sélectionne le deuxième onglet, la position de onPageSelected est de 1,
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mCollectionPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
mActionBar.setSelectedNavigationItem(position);
}
});
Cela provoque l'appel à la méthode public Fragment getItem(int i) à l'intérieur de la CollectionPagerAdapter classe, mais alors la valeur de i est à 2 PAS 1, alors il appelle la createView pour la TabFragment classe avec une valeur de 2 PAS 1, de sorte que les onglets ne sont pas rafraîchissant avec succès.
Toute aide sera vraiment apprécié!!
Code pour créer les onglets,
//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());
}
Lorsqu'un onglet est sélectionné,
@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 classe
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 classe
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();
}
}
Je ne sais pas ce que je fais mal, je suppose que les fragments sont foiré, parce que quand j'appuie sur le deuxième onglet, les données du premier onglet est mis à jour, et ainsi de suite ...
Merci!
OriginalL'auteur nirvik | 2013-01-05
Vous devez vous connecter pour publier un commentaire.
Au lieu d'utiliser CollectionPageAdapter, j'ai changé d'utiliser le TabsAdapter classe dans Android documentation de ViewPager et ça marche!!!
}`
Désolé pour le retard, je n'avais pas pris un coup d'oeil à ce code pour un long moment, donc je ne me souviens pas de ce que j'ai changé 🙁 je vais l'ajouter en tant que répondre à mes TabsAdapter code.
Merci pour la réponse. Je l'ai compris en fait. Je suis allé le chemin de la TabAdapter et tout à l'air beaucoup mieux. Encore quelques problèmes de rechargement des onglets, mais l'aurez compris.
OriginalL'auteur nirvik
Je suis d'accord avec nirvik sur ce, il existe cependant une cruciual d'amélioration qui doivent être apportées. Cette la mise en œuvre a qu'un seul défaut - lorsque le balayage d'un fragment suivant la onPageSelected méthode est invoquée, qui à son tour appelle onTabSelected méthode en appelant mActionBar.setSelectedNavigationItem(position);. Cela provoque un scintillement dans l'animation.
Ce:
devrait être remplacé par ceci:
résultant en une transition en douceur.
OriginalL'auteur Piotr Zawadzki
Vous pouvez essayer, y compris le code suivant dans votre
FragmentPagerAdapter
et voir si cela résout le problème.Vous pouvez également essayer d'utiliser un
FragmentStatePagerAdapter
.OriginalL'auteur Oleg Vaskevich