0

J'ai un Activity avec un ViewPager et un adaptateur personnalisé qui implémente le PagerAdaper. Je gonfle une vue à l'intérieur du PagerAdapter et j'ajoute des sous-vues à la vue parente. Ces sous-vues sont RadioGroup, Checkboxes, EditText etc. en fonction d'un certain paramètre de l'objet de la liste que je passe à l'adaptateur.Obtenir des valeurs de vues gonflées dans un PagerAdapter

Je souhaite obtenir les valeurs de ces sous-vues une fois la page modifiée. Mais puisque mon code d'inflation est dans l'adaptateur, j'ai besoin de savoir comment puis-je détecter le changement de page de mon adaptateur lui-même.

Voici mon code pour l'adaptateur: -

public override Java.Lang.Object InstantiateItem(ViewGroup container, int position) 
     { 
      var view = voteFormActivity.LayoutInflater.Inflate(Resource.Layout.active_votes_layout, container, false); 
      txtvoteTitle = view.FindViewById<TextView>(Resource.Id.txtTitle); 
      //radioGroup = view.FindViewById<RadioGroup>(Resource.Id.radioGroupChoice); 
      btnSubmit = view.FindViewById<Button>(Resource.Id.btnSubmit); 
      layoutForcomponents = view.FindViewById<LinearLayout>(Resource.Id.layoutForComponents); 


      radioGroup = new RadioGroup(voteFormActivity); 

      var data = selectedVotes.ElementAt(position); 



      if (data != null) 
      { 
       if (!string.IsNullOrEmpty(data.Title)) 
       { 
        txtvoteTitle.Text = data.Title; 
       } 


       var choiceList = data.Choices; 

       if (choiceList != null && choiceList.Count > 0) 
       { 
        if (checkParam == "RadioChoice") 
        { 
         foreach (var choice in choiceList) 
         { 
          RadioButton rButton = new RadioButton(voteFormActivity); 
          rButton.Text = choice; 
          radioGroup.AddView(rButton); 
          layoutForcomponents.RemoveAllViews(); 
          layoutForcomponents.AddView(radioGroup); 
         } 
        } 
        else if (checkParam == "CheckBoxChoice") 
        { 
         foreach (var choice in choiceList) 
         { 
          CheckBox cButton = new CheckBox(voteFormActivity); 
          cButton.Text = choice; 
          radioGroup.AddView(cButton); 
          layoutForcomponents.RemoveAllViews(); 

          layoutForcomponents.AddView(radioGroup); 

         } 
        } 

       } 
       //if (checkParam == "MultiLineText") 
       else{ 
        EditText etMultilineText = new EditText(voteFormActivity); 
        etMultilineText.Hint = "Enter feedback"; 
        etMultilineText.SetLines(6); 
        layoutForcomponents.RemoveAllViews(); 

        layoutForcomponents.AddView(etMultilineText); 
       } 
      } 
      container.AddView(view); 
      return view; 
     } 

Je passe l'adaptateur à mon ViewPager comme suit: -

mViewPager.Adapter = new PollViewPagerAdapter(this, this.FragmentManager, AppHelper.SelectedVotes); 

Comment puis-je détecter le changement de page et d'obtenir les valeurs de les RadioGroup, Checkbox et EditText? Toute aide est appréciée.

+0

Il existe un 'ViewPager.onPageChangeListener 'que vous attachez au viewpager. Est-ce que c'est ce que tu cherchais? Je peux l'ajouter comme réponse si oui – RobVoisey

+0

@RobVoisey 'ViewPager.onPageChangeListener' doit être appliqué à l'activité, mais les valeurs dont j'ai besoin sont gonflées dans' PagerAdapter', comment puis-je obtenir ces valeurs quand la page change? – user3034944

+0

Ne pouvez-vous pas simplement stocker les vues sous forme de champs dans votre classe? 'ViewPager.onPageChangeListener' vous permet de savoir quand la page a été mise à jour et vous pouvez obtenir la page en cours d'affichage, alors vous saurez quels champs de vue à utiliser. – RobVoisey

Répondre

0

Vous n'avez pas besoin de savoir quand une page défile dans l'adaptateur. Vous pouvez attribuer une page à l'auditeur fait défiler téléavertisseur comme ceci:

viewPager.setOnPageChangeListener(object : OnPageChangeListener { 
     override fun onPageScrollStateChanged(state: Int) {} 
     override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} 
     override fun onPageSelected(position: Int) {} 
    }) 

Je garde la logique en dehors de l'adaptateur. Vous pouvez même créer une interface entre votre activité/fragment et votre adaptateur pour écouter des événements tels que les changements d'état de radiogroupes et ainsi de suite.

Modifier

Permettez-moi de préciser davantage. Il n'y a pas de réponse correcte à votre question. Vous pouvez implémenter ce type de comportement de plusieurs façons. Supposons que vous ayez un radiogroup dans votre adaptateur avec un écouteur de changement vérifié. A l'intérieur de la méthode de modification vérifiée, vous pouvez appeler une méthode d'interface que vous avez définie dans l'adaptateur, par exemple. Définissez cette interface à l'intérieur de l'adaptateur et faites en sorte que votre fragment/activité l'implémente. Puis déclarer l'adaptateur faisant passer l'activité/fragment dans le constructeur comme un objet radioChangedListener:

class YourAdapter(var listItems: MutableList<YourItem>, val yourListener: RadioChangedListener) 
: RecyclerView.Adapter<YourAdapter.YourHolder>() { 

//...adapter code 

} 

Enfin, dans votre écouteur radiogroup vous pouvez appeler votre méthode d'interface comme si (vous donnant le code Java pour cette cause je m paresseux):

RadioGroup radioGroup = (RadioGroup) findViewById(R.id.yourRadioGroup);   
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() 
{ 
    @Override 
    public void onCheckedChanged(RadioGroup group, int checkedId) { 
     yourListener.radioChanged(checkedId) 
    } 
}); 

Cela déclenchera votre méthode radioChanged dans l'activité, dans laquelle vous pouvez stocker votre valeur.

+0

merci pour la réponse. Je cherche exactement la deuxième partie de votre réponse. Pouvez-vous m'expliquer comment je peux écouter des événements tels que les changements d'état du radiogroupe entre l'adaptateur et l'activité? – user3034944

+0

Merci. Je vais essayer cela – user3034944

+0

Pas de problème, vous pouvez également stocker les valeurs dans les champs de votre adaptateur et appeler une méthode comme 'getCurrentSelectedValues ​​()' de l'activité dans la méthode onPageChanged, obtenir les valeurs de l'élément en position-1 –