2017-10-06 2 views
0

J'utilise Viewpager pour gonfler dynamiquement mes mises en page en fonction d'un certain nombre de questions dans ma boucle.Comment trouver la dernière disposition gonflée dans Viewpager

Ceci est réalisé comme suit:

for (String x : array1) { 
       //loop out the number of layouts relative to the number of questions held in x 
       View current_layout = LayoutInflater.from(getActivity()).inflate(R.layout.question_fragment, null); 

     //use the page adapter to add the layout to the user's view 
      pagerAdapter.addView(current_layout); 
    } 

J'ai un bouton sur ma mise en page et je veux que ce bouton soit visible en fonction de la mise en page finale étant gonflé.

J'utilise l'adaptateur suivant

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 the 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". 
    // Returns 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 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. 
} 

Je suis nouveau à l'utilisation Viewpager donc pas tout à fait sûr de savoir comment se fait - je suis en supposant qu'une méthode personnalisée doit être créé, mais après avoir une recherche, je ne pouvait pas trouver quelque chose qui soit expliqué clairement comment cela a été réalisé ou utile pour mon scénario.

Je sais que je pourrais écrire ce qui suit pour faire disparaître le bouton sur la première mise en page mais je suis confus par rapport à la dernière mise en page.

//Set button on the last layout in the viewpager 

    if (count == pagerAdapter.getCount()+1){ 

getCurrentPage().findViewById(R.id.btn_submit_question).setVisibility(View.GONE); 
    } 

J'ai essayé de réaliser ce que je suis après avec

//Set button on the last layout in the viewpager 
       if (count != pagerAdapter.getCount()-1){ 

        current_layout.findViewById(R.id.btn_submit_question).setVisibility(View.GONE); 

       } 

mais n'a pas eu de chance.

J'ai aussi ces méthodes disponibles

// 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); 
    } 
+0

Vous pouvez utiliser le viewPager.addOnPageChangeListener et obtenir la dernière vue sélectionnée par views.get (position) –

Répondre

0

J'ai réussi à résoudre le problème avec ce qui suit.

Merci à Pranav Bhatt & Feu froid pour me pointer dans la bonne direction.

//Set button on the last layout in the viewpager 

if (pager.getAdapter().getCount()!= array1.length){ 

current_layout.findViewById(R.id.btn_submit_question).setVisibility(View.GONE); 

    } 
1

Vous devez utiliser la méthode ViewPager.getAdapter().getCount()

The getAdapter() renvoie l'objet qui fournit les pages pour la ViewPager.

La méthode getCount() retour combien de pages a été ajouté déjà si

if(ViewPager.getAdapter().getCount()==array1-1){ 
// set button invisible here 
} 

espère qu'il vous aide.

+0

Pouvez-vous donner un exemple? Je vous remercie d'essayer de m'aider à trouver une solution. –

+0

@Displayname vérifier l'édition –

+0

Merci ColdFire de l'éditer. @Displayname Veuillez cocher la réponse maintenant. – InsaneCat