0

ActivityにはViewPager、カスタムアダプターにはPagerAdaperが実装されています。私はPagerAdapterの中のビューを膨らませて、親ビューにサブビューを追加しています。これらのサブビューは、アダプターに渡すリストのオブジェクトの特定のパラメーターに応じて、RadioGroupCheckboxesEditTextなどです。PagerAdapterで膨らんだビューから値を取得

ページが変更されると、これらのサブビューから値を取得します。しかし、私のインフレコードはアダプターの中にあるので、アダプター自体からページの変更をどのように検出できるのか知る必要があります。次のように私は私のViewPagerにアダプタを渡す

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

: - - :ここで

は、アダプタの私のコードである私は、ページの変更を検出してから値を取得できますか

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

RadioGroup,CheckboxおよびEditText?どんな助けもありがとうございます。

+0

ビューページに添付する 'ViewPager.onPageChangeListener 'があります。これはあなたの後だったのですか? – RobVoisey

+0

@RobVoisey 'ViewPager.onPageChangeListener'をアクティビティに適用する必要がありますが、必要な値が' PagerAdapter'で膨らんでいますが、ページが変更されたときにそれらの値を取得するにはどうすればよいですか? – user3034944

+0

ビューをクラスのフィールドとして単に保存することはできますか? 'ViewPager.onPageChangeListener'は、ページが更新されたことを知らせ、現在表示されているページを取得できる場合に、使用するビューフィールドを知ります。 – RobVoisey

答えて

0

アダプター内でページがスクロールされるタイミングを知る必要はありません。私はアダプターの外にロジックを維持したい

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

:あなたはこのようにポケットベルにページスクロールリスナーを割り当てることができます。あなたはあなたのActivity/Fragmentとあなたのアダプターとの間のインターフェースでさえ、ラジオグループの状態の変化のようなイベントを聞くことができます。

編集

私はさらに詳しく説明してみましょう。あなたの質問に正解はありません。この種の動作はさまざまな方法で実装できます。アダプタにチェック・チェンジ・リスナーを持つradiogroupがあるとします。チェックされた変更メソッドの内部では、たとえばアダプタ内で定義したインタフェースメソッドを呼び出すことができます。

interface RadioChangedListener{ 
    fun radioChanged(radioId: Int) 
} 

このインターフェイスをアダプタ内で定義し、フラグメント/アクティビティで実装します。そして、radioChangedListenerオブジェクトとしてコンストラクタで活動/フラグメントを渡すアダプタを宣言:

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

//...adapter code 

} 

最後に、あなたのラジオ・リスナーにそう(あなたに私は「この原因のためのJavaコードを与えるようなあなたのインターフェイスメソッドを呼び出すことができますM怠惰):

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

これはあなたの値を格納することができている活動中にあなたradioChanged方法を、トリガされます。

+0

答えに感謝します。私はあなたの答えの2番目の部分を正確に探しています。アダプターとアクティビティーの間のラジオグループ状態の変化のようなイベントをどのように聞くことができるかを詳しく教えてください。 – user3034944

+0

ありがとうございます。これを試してみる – user3034944

+0

問題はありません。アダプタのフィールドに値を格納し、onPageChangedメソッド内のActivityからgetCurrentSelectedValues()などのメソッドを呼び出して、position-1の項目の値を取得することもできます –

関連する問題