Après avoir déterminé quelles méthodes ViewPager sont appelées par ViewPager et lesquelles sont utilisées à d'autres fins, j'ai trouvé une solution. Je le présente ici car je vois que beaucoup de gens ont eu du mal avec cela et je n'ai vu aucune autre réponse pertinente.
Tout d'abord, voici mon adaptateur; j'espère que les commentaires dans le code sont suffisants:
public class MainPagerAdapter extends PagerAdapter
{
// This holds all the currently displayable views, in order from left to right.
private ArrayList<View> views = new ArrayList<View>();
//-----------------------------------------------------------------------------
// Used by ViewPager. "Object" represents the page; tell the ViewPager where the
// page should be displayed, from left-to-right. If the page no longer exists,
// return POSITION_NONE.
@Override
public int getItemPosition (Object object)
{
int index = views.indexOf (object);
if (index == -1)
return POSITION_NONE;
else
return index;
}
//-----------------------------------------------------------------------------
// Used by ViewPager. Called when ViewPager needs a page to display; it is our job
// to add the page to the container, which is normally the ViewPager itself. Since
// all our pages are persistent, we simply retrieve it from our "views" ArrayList.
@Override
public Object instantiateItem (ViewGroup container, int position)
{
View v = views.get (position);
container.addView (v);
return v;
}
//-----------------------------------------------------------------------------
// Used by ViewPager. Called when ViewPager no longer needs a page to display; it
// is our job to remove the page from the container, which is normally the
// ViewPager itself. Since all our pages are persistent, we do nothing to the
// contents of our "views" ArrayList.
@Override
public void destroyItem (ViewGroup container, int position, Object object)
{
container.removeView (views.get (position));
}
//-----------------------------------------------------------------------------
// Used by ViewPager; can be used by app as well.
// Returns the total number of pages that the ViewPage can display. This must
// never be 0.
@Override
public int getCount ()
{
return views.size();
}
//-----------------------------------------------------------------------------
// Used by ViewPager.
@Override
public boolean isViewFromObject (View view, Object object)
{
return view == object;
}
//-----------------------------------------------------------------------------
// Add "view" to right end of "views".
// Returns the position of the new view.
// The app should call this to add pages; not used by ViewPager.
public int addView (View v)
{
return addView (v, views.size());
}
//-----------------------------------------------------------------------------
// Add "view" at "position" to "views".
// Returns position of new view.
// The app should call this to add pages; not used by ViewPager.
public int addView (View v, int position)
{
views.add (position, v);
return position;
}
//-----------------------------------------------------------------------------
// Removes "view" from "views".
// Retuns position of removed view.
// The app should call this to remove pages; not used by ViewPager.
public int removeView (ViewPager pager, View v)
{
return removeView (pager, views.indexOf (v));
}
//-----------------------------------------------------------------------------
// Removes the "view" at "position" from "views".
// Retuns position of removed view.
// The app should call this to remove pages; not used by ViewPager.
public int removeView (ViewPager pager, int position)
{
// ViewPager doesn't have a delete method; the closest is to set the adapter
// again. When doing so, it deletes all its views. Then we can delete the view
// from from the adapter and finally set the adapter to the pager again. Note
// that we set the adapter to null before removing the view from "views" - that's
// because while ViewPager deletes all its views, it will call destroyItem which
// will in turn cause a null pointer ref.
pager.setAdapter (null);
views.remove (position);
pager.setAdapter (this);
return position;
}
//-----------------------------------------------------------------------------
// Returns the "view" at "position".
// The app should call this to retrieve a view; not used by ViewPager.
public View getView (int position)
{
return views.get (position);
}
// Other relevant methods:
// finishUpdate - called by the ViewPager - we don't care about what pages the
// pager is displaying so we don't use this method.
}
Et voici quelques extraits de code montrant comment utiliser l'adaptateur.
class MainActivity extends Activity
{
private ViewPager pager = null;
private MainPagerAdapter pagerAdapter = null;
//-----------------------------------------------------------------------------
@Override
public void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView (R.layout.main_activity);
... do other initialization, such as create an ActionBar ...
pagerAdapter = new MainPagerAdapter();
pager = (ViewPager) findViewById (R.id.view_pager);
pager.setAdapter (pagerAdapter);
// Create an initial view to display; must be a subclass of FrameLayout.
LayoutInflater inflater = context.getLayoutInflater();
FrameLayout v0 = (FrameLayout) inflater.inflate (R.layout.one_of_my_page_layouts, null);
pagerAdapter.addView (v0, 0);
pagerAdapter.notifyDataSetChanged();
}
//-----------------------------------------------------------------------------
// Here's what the app should do to add a view to the ViewPager.
public void addView (View newPage)
{
int pageIndex = pagerAdapter.addView (newPage);
// You might want to make "newPage" the currently displayed page:
pager.setCurrentItem (pageIndex, true);
}
//-----------------------------------------------------------------------------
// Here's what the app should do to remove a view from the ViewPager.
public void removeView (View defunctPage)
{
int pageIndex = pagerAdapter.removeView (pager, defunctPage);
// You might want to choose what page to display, if the current page was "defunctPage".
if (pageIndex == pagerAdapter.getCount())
pageIndex--;
pager.setCurrentItem (pageIndex);
}
//-----------------------------------------------------------------------------
// Here's what the app should do to get the currently displayed page.
public View getCurrentPage ()
{
return pagerAdapter.getView (pager.getCurrentItem());
}
//-----------------------------------------------------------------------------
// Here's what the app should do to set the currently displayed page. "pageToShow" must
// currently be in the adapter, or this will crash.
public void setCurrentPage (View pageToShow)
{
pager.setCurrentItem (pagerAdapter.getItemPosition (pageToShow), true);
}
}
Enfin, vous pouvez utiliser les éléments suivants pour votre activity_main.xml
mise en page:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</android.support.v4.view.ViewPager>
Je cherchais une solution simple pour supprimer dynamiquement les vues du viewpager (sans fragments). Donc, si vous avez des informations auxquelles appartiennent vos pages, vous pouvez les définir sur Afficher comme balise. Juste comme ça (code de l'adaptateur):
Il vous suffit de supprimer vos informations de mMessages, puis d'appeler
notifyDataSetChanged()
votre adaptateur. Mauvaise nouvelle il n'y a pas d'animation dans ce cas.la source
Il y a pas mal de discussions autour de ce sujet
Bien que nous le voyions souvent, l'utilisation
POSITION_NONE
ne semble pas être la voie à suivre car elle est très inefficace en termes de mémoire.Ici, dans cette question, nous devrions envisager d'utiliser l'approche d'Alvaro :
Voici une réponse SO avec un code basé sur cette idée
la source
J'ai fait un programme similaire. J'espère que cela vous aidera. Dans sa première activité, quatre données de grille peuvent être sélectionnées. Sur l'activité suivante, il y a un pager de vue qui contient deux pages obligatoires et 4 autres pages seront là, qui seront visibles en fonction des données de grille sélectionnées.
Voici la principale activité MainActivity
Ici TabFragment1, TabFragment2 etc. sont des fragments à afficher sur le viewpager.Et je ne montre pas les mises en page car elles sont hors de portée de ce projet.
MainActivity aura l'intention de Main2Activity Main2Activity
ViewPagerAdapter Viewpageradapter.class
Mise en page pour main2activity acticity_main2.xml
J'espère que cela aiderait quelqu'un ... Cliquez sur le bouton haut s'il vous plaît si cela vous a aidé
la source
Voici une solution alternative à cette question. Mon adaptateur:
Code à supprimer et à ajouter dynamiquement
Après les conseils de Peri Hartman, cela a commencé à fonctionner après avoir défini null do l'adaptateur ViewPager et remis l'adaptateur après la suppression des vues. Avant cela, la page 0 n'affichait pas le contenu de sa liste.
Merci.
la source
J'ai créé une bibliothèque PagerAdapters personnalisée pour modifier les éléments de PagerAdapters de manière dynamique.
Vous pouvez modifier les éléments de manière dynamique comme suit en utilisant cette bibliothèque.
La bibliothèque Thils prend également en charge les pages créées par Fragments.
la source
Pour supprimer, vous pouvez utiliser ceci directement:
fragment
est le fragment que vous souhaitez supprimer.la source
Je trouve une bonne solution à ce problème, cette solution peut le faire fonctionner et pas besoin de recréer des fragments.
Mon point clé est:
Code source
Le code est à mon Github Gist .
la source