Je ne peux pas mettre à jour le contenu du ViewPager.
Quelle est l'utilisation correcte des méthodes instantiateItem() et getItem() dans la classe FragmentPagerAdapter ?
J'utilisais seulement getItem() pour instancier et retourner mes fragments :
@Override
public Fragment getItem(int position) {
return new MyFragment(context, paramters);
}
Cela a bien fonctionné. Sauf que je ne peux pas changer le contenu.
Alors j'ai trouvé ça : ViewPager PagerAdapter ne met pas à jour la vue
"Mon approche est d'utiliser la méthode setTag() pour toute vue instanciée dans la méthode instantiateItem()"
Maintenant, je veux implémenter instantiateItem() pour le faire. Mais je ne sais pas ce que je dois retourner (le type est Object) et quelle est la relation avec getItem(int position) ?
J'ai lu le référence :
public abstract Fragment getItem (int position)
Retourne le Fragment associé à une position spécifiée.
public Object instantiateItem (ViewGroup container, int position)
Crée la page pour la position donnée. L'adaptateur est responsable de l'ajout de la vue au conteneur donné ici, bien qu'il doive seulement s'assurer que cela est fait au moment où il retourne de finishUpdate(ViewGroup). Paramètres
container La vue contenant dans laquelle la page sera affichée. position La position de la page à instancier.
Renvoie à
Renvoie un objet représentant la nouvelle page. Il ne s'agit pas nécessairement d'une vue, mais peut être un autre conteneur de la page.
mais je ne comprends toujours pas.
Voici mon code. J'utilise le paquet de support v4.
ViewPagerTest
public class ViewPagerTest extends FragmentActivity {
private ViewPager pager;
private MyFragmentAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pager1);
pager = (ViewPager)findViewById(R.id.slider);
String[] data = {"page1", "page2", "page3", "page4", "page5", "page6"};
adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, data);
pager.setAdapter(adapter);
((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
reload();
}
});
}
private void reload() {
String[] data = {"changed1", "changed2", "changed3", "changed4", "changed5", "changed6"};
//adapter = new MyFragmentAdapter(getSupportFragmentManager(), 6, this, data);
adapter.setData(data);
adapter.notifyDataSetChanged();
pager.invalidate();
//pager.setCurrentItem(0);
}
}
MonFragmentAdapter
class MyFragmentAdapter extends FragmentPagerAdapter {
private int slideCount;
private Context context;
private String[] data;
public MyFragmentAdapter(FragmentManager fm, int slideCount, Context context, String[] data) {
super(fm);
this.slideCount = slideCount;
this.context = context;
this.data = data;
}
@Override
public Fragment getItem(int position) {
return new MyFragment(data[position], context);
}
@Override
public int getCount() {
return slideCount;
}
public void setData(String[] data) {
this.data = data;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
MonFragment
public final class MyFragment extends Fragment {
private String text;
public MyFragment(String text, Context context) {
this.text = text;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.slide, null);
((TextView)view.findViewById(R.id.text)).setText(text);
return view;
}
}
Voici également quelqu'un qui a un problème similaire, sans réponse. http://www.mail-archive.com/Android-developers@googlegroups.com/msg200477.html
0 votes
Pour mieux comprendre les composants impliqués, il peut être utile de lire mon tutoriel sur un ViewPager à onglets avec historique séparé de la navigation arrière. Il est accompagné d'un exemple fonctionnel sur GitHub et de ressources supplémentaires : medium.com/@nilan/
0 votes
J'ai un problème stackoverflow.com/questions/40149039/
0 votes
Vous pouvez vérifier ceci exemple dans GitHub . J'espère que cet exemple vous aidera.
0 votes
Bonne solution simple : stackoverflow.com/a/35450575/2162226
0 votes
Google a récemment introduit ViewPager2 qui simplifie les mises à jour dynamiques des fragments/vues. Vous pouvez voir des exemples sur github.com/googlesamples/Android-viewpager2 ou cette réponse sur stackoverflow.com/a/57393414/1333448