Comment faire pour Supprimer Fragment de FragmentPagerAdapter?
Je sais qu'il y a certains sujets sur ce déjà ici, mais je ne pouvais pas trouver une solution qui je pourrais aller travailler pour mon cas.
J'ai un travail de glissement de la galerie à l'aide d'un custom FragmentActivity
et FragmentPagerAdapter
qui contient une liste de Fragments.
Dans le FragmentActivity
est un ImageView
"supprimer". Si cliqué, la fonction deleteMedia()
est appelé, ce qui devrait alors supprimer le Fragment
et suivants Fragment
doit être affiché.
Comment aurais-je à faire dans mon exemple?
FragmentActivity:
public class GalleryPagerActivity extends FragmentActivity implements OnClickListener {
private Intent intent;
private SharedPreferences settings;
private PagerAdapter mPagerAdapter;
private ViewPager mPager;
private List<Fragment> fragments;
private List<WhiteboardMedia> wiList;
private int selectedPosition;
private LinearLayout llTop;
private TextView tvTop;
private ImageView delete;
private ImageView share;
private TextView tvCounter;
private TextView tvFilename;
private TextView tvFilesize;
private TextView tvDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
super.setContentView(R.layout.gallery_pager);
intent = getIntent();
Type collectionType = new TypeToken<List<WhiteboardMedia>>(){}.getType();
wiList = gson.fromJson(intent.getStringExtra("wiList"), collectionType);
selectedPosition = intent.getIntExtra("position", 1);
llTop = (LinearLayout) findViewById(R.id.llTop);
llTop.setOnClickListener(this);
tvTop = (TextView) findViewById(R.id.tvTop);
tvTop.setOnClickListener(this);
delete = (ImageView) findViewById(R.id.imgDelete);
delete.setOnClickListener(this);
share = (ImageView) findViewById(R.id.imgShare);
share.setOnClickListener(this);
tvCounter = (TextView) findViewById(R.id.tvCounter);
tvFilename = (TextView) findViewById(R.id.tvFilename);
tvFilesize = (TextView) findViewById(R.id.tvFilesize);
tvDate = (TextView) findViewById(R.id.tvDate);
createContextMenu();
initDropbox();
} catch (Exception e) {
Log.e("GalleryPagerActivity", e.getLocalizedMessage());
}
}
/**
* Initialise the pager
*/
private void initialisePager() {
mPager = (ViewPager) super.findViewById(R.id.viewpager);
mPager.setAdapter(this.mPagerAdapter);
mPager.setOnPageChangeListener(new GalleryPageListener(tvCounter, tvFilename, tvFilesize, tvDate, wiList));
mPager.setCurrentItem(selectedPosition, true);
updatePage(selectedPosition);
}
public void updatePage(int position)
{
int focusedPage = position + 1;
Log.i("onPageSelected", "page selected " + position);
WhiteboardMedia wiImage = wiList.get(position);
String imageDate = "N/A";
try {
Date dateTaken= new Date(); //wiImage.getDate();
SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd");
imageDate = sdf.format(dateTaken);
} catch (Exception e) {
}
try {
tvCounter.setText(focusedPage + "/" + wiList.size());
tvFilename.setText(wiImage.getFilename());
tvFilesize.setText(wiImage.getSize() + "a");
tvDate.setText(imageDate);
} catch (Exception e) {
}
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onDestroy() {
super.onDestroy();
}
private WhiteboardMedia getActiveWhiteboardImage() {
return wiList.get(mPager.getCurrentItem());
}
private final int DELETE = 1;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1, DELETE, 2, R.string.delete).setIcon(R.drawable.menu_btn_trash);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case DELETE:
deleteMedia();
return true;
}
return super.onContextItemSelected(item);
}
@Override
public void onClick(View v) {
if (v == delete) {
deleteMedia();
}
}
private void deleteMedia() {
//TODO delete the active Fragment and display the next Fragment in the list
}
/******************************************************************************
* Context Menu
*****************************************************************************/
private void createContextMenu() {
//context menu stuff
}
@Override
protected Dialog onCreateDialog(int id) {
//stuff
}
}
FragmentPagerAdapter:
public class GalleryPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public GalleryPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
Merci pour l'aide!
OriginalL'auteur e-nature | 2012-03-18
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, je vous suggérons d'envisager la modification de votre
FragmentPagerAdapter
, à regarder de plus comme l'échantillon. Vous n'avez normalement pas tenir une liste de fragments, plus deArrayAdapter
tient normalement une liste deViews
pour les lignes. Normalement, vous créez les fragments sur la demande, et quelqu'un d'autre détient la liste.Puis, de supprimer quelque chose, de le supprimer à partir de votre modèle de données (ce que l'
FragmentPagerAdapter
normalement enveloppe). Assurez-vous quegetCount()
sera de retour le nombre d'articles. Ensuite, appeleznotifyDataSetChanged()
sur leFragmentPagerAdapter
, qui doit déclencher un renouvellement de laViewPager
.for (int i = 0; i < wiList.size(); i++) { WhiteboardMedia tmpWi = wiList.get(i); if (tmpWi.getType() == IMAGE) { fragments.add(IMAGE); } else if () { fragments.add(AUDIO); } else if () { fragments.add(VIDEO); } } mAdapter = new MPagerAdapter(getSupportFragmentManager(), fragments);
Où dois-je placer ce code? Dans l'exemple, il semble comme les Fragments sont tous du même type.aurait besoin d'avoir l'intelligence de retour le droit de fragment.
Ugh, j'ai eu le même problème pour les âges. Les fragments de ne pas obtenir recueillies et y rester visuellement (dans leur vieille et mauvaise position) jusqu'à ce que je défilement trop à droite/à gauche et le système de rebuts et resyncs. Toute idée de ce que je fais mal? Mon code ressemble plutôt l'exemple.
L'ajout et la suppression des fragments suffisamment de douleur que j'ai finalement écrit
ArrayPagerAdapter
pour essayer de fournir une meilleure solution: github.com/commonsguy/cwac-pager Il est encore tôt pour le composant, mais il tient ses promesses.Oh que c'est magnifique, merci!!!! Je viens de recevoir le
FragmentPagerAdapter
de travail (besoin d'unFragmentStatePager
en fin de compte, la vanilleFragmentPagerAdapter
n'aime pas la suppression de fragments), mais je vais utiliser votre composant la prochaine fois, je vous remercie!OriginalL'auteur CommonsWare
c'est la solution que j'utilise:
mViewPager : c'est la vue que vous utilisez pour vous mettre en valeur Fragment
TABLE : est-ce juste une liste d'Entiers de la position de tous mes Fragments
Parfait Douarbou ! Merci !
Fonctionne comme un charme! Sauvé Mon temps! Merci 🙂
Je suis en train de retirer un fragment sélectionné sur la base de la position, en raison de ce mode code est supprimée, mais un vide fragment est toujours à l'affiche. Comment faire pour supprimer le fragment?
OriginalL'auteur douarbou
J'ai trouvé une solution ovverriding la méthode "onPostResume()" de l'activité et de l'appel de la notifyDataSetChanged à l'intérieur.
OriginalL'auteur Michele Sapignoli
Si vous utilisez FragmentPagerAdapter pour ajouter et supprimer des fragments au hasard position(pas toujours à la fin) de manière dynamique, il y a une méthode, vous devez prendre plus d'attention, ce qui est getItemId. Par défaut, FragmentPagerAdapter position combine viewId comme le nom de la balise pour les fragments, toutefois, la situation change si vous ajoutez ou supprimez des fragments. Comme un résultat, vous pouvez obtenir une page vide, parce que la position que vous ajoutez est occupé par un fragment. Pour résoudre ce problème, remplacer getItemId.
Ce que vous devez faire est d'appeler la notifyDatasetChanged sur la carte après l'ajout ou la suppression des fragments. Pas sûr que cela répond à votre "automatiquement" à la question.
OriginalL'auteur Jason
Dans mon cas, lorsque j'essaie de supprimer un élément de la carte, je vais faire comme suit:
La raison que j'ai fait ci-dessus est que je trouve que même si vous avez supprimé un à partir de la liste de données, mais le point de vue de fragment existent encore. Donc, vous devez laisser le point de vue de radiomessagerie instancier le point de vue de la position donnée. La réponse ci-dessus, qui consiste à essayer d'enlever tous les fragments ne fonctionne pas pour moi. Je trouve donc le pauvre manière de mettre de la carte pour afficher pager de nouveau.
OriginalL'auteur Shouheng Wang