0

Ich habe eine Activity mit einer ViewPager und einen benutzerdefinierten Adapter, der die PagerAdaper implementiert. Ich vergrößere eine Ansicht innerhalb der PagerAdapter und Hinzufügen von Unteransichten zur übergeordneten Ansicht. Diese Unteransichten sind RadioGroup, Checkboxes, EditText usw., abhängig von einem bestimmten Parameter des Objekts, dessen Liste ich an den Adapter übergebe.Erhalten Werte von Ansichten in einem PagerAdapter aufgeblasen

Ich möchte die Werte aus diesen Unteransichten erhalten, sobald die Seite geändert wird. Aber da mein Inflationscode im Adapter ist, muss ich wissen, wie ich den Seitenwechsel von meinem Adapter selbst erkennen kann.

Hier ist mein Code für den Adapter: -

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; 
     } 

ich den Adapter an meine ViewPager passieren, wie folgt: -

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

Wie kann ich den Seitenwechsel erkennen und die Werte erhalten aus die RadioGroup, Checkbox und EditText? Jede Hilfe wird geschätzt.

+0

Es gibt einen 'ViewPager.onPageChangeListener', den Sie an den Viewpager anhängen. Wolltest du das? Ich kann es als Antwort hinzufügen, wenn das so ist – RobVoisey

+0

@RobVoisey 'ViewPager.onPageChangeListener' muss auf die Aktivität angewendet werden, aber die Werte, die ich brauche, sind im' PagerAdapter' aufgeblasen, wie kann ich diese Werte bekommen, wenn sich die Seite ändert? – user3034944

+0

Können Sie die Ansichten nicht einfach als Felder in Ihrer Klasse speichern? 'ViewPager.onPageChangeListener' lässt Sie wissen, wenn die Seite aktualisiert wurde und Sie können die aktuell angezeigte Seite sehen, dann wissen Sie, welche Ansichtsfelder verwendet werden sollen. – RobVoisey

Antwort

0

Sie müssen nicht wissen, wenn eine Seite im Adapter gescrollt wird. Sie können dem Pager einen Seiten-gescrollten Listener wie folgt zuweisen:

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

Ich würde die Logik außerhalb des Adapters behalten. Sie können sogar eine Schnittstelle zwischen Ihrem Activity/Fragment und Ihrem Adapter herstellen, um Ereignisse wie Radiogroup-Statusänderungen und ähnliches zu hören.

bearbeiten

mich weiter zu erarbeiten Lassen Sie versuchen. Es gibt keine richtige Antwort auf Ihre Frage. Sie können diese Art von Verhalten auf viele Arten implementieren. Angenommen, Sie haben eine Funkgruppe in Ihrem Adapter mit einem überprüften Änderungslistener. Innerhalb der Checked-Change-Methode können Sie beispielsweise eine Interface-Methode aufrufen, die Sie im Adapter definiert haben.

interface RadioChangedListener{ 
    fun radioChanged(radioId: Int) 
} 

Definieren Sie diese Schnittstelle innerhalb des Adapters und implementieren Sie Ihr Fragment/Ihre Aktivität. Dann erklären Sie den Adapter es die Aktivität/Fragment im Konstruktor als radioChangedListener Objekt übergeben:

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

//...adapter code 

} 

schließlich in Ihrem Radiogroup Zuhörers Sie Ihr Interface-Methode aufrufen kann wie so (Sie den Java-Code für diese Sache geben ich m faul):

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

Dies wird Ihre radioChanged Methode innerhalb der Aktivität auslösen, in dem Sie Ihren Wert speichern.

+0

danke für die Antwort. Ich suche genau den zweiten Teil Ihrer Antwort. Kannst du bitte erläutern, wie ich Ereignisse wie Radiogroup-Statusänderungen zwischen dem Adapter und Activity abhören kann? – user3034944

+0

Danke. Ich werde dies ausprobieren – user3034944

+0

Kein Problem, Sie könnten auch die Werte innerhalb Felder in Ihrem Adapter speichern und rufen Sie eine Methode wie 'getCurrentSelectedValues ​​()' aus der Aktivität innerhalb der OnPageChanged-Methode, die Werte für das Element in Position-1 –

Verwandte Themen