从 PagerAdapter 中膨胀的视图中获取值
Get Values from views inflated in a PagerAdapter
我有一个带有 ViewPager
的 Activity
和一个实现 PagerAdaper
的自定义适配器。我在 PagerAdapter
中膨胀一个视图并将子视图添加到父视图。这些子视图是 RadioGroup
、Checkboxes
、EditText
等,具体取决于我将其列表传递给适配器的对象的特定参数。
我想在页面更改后从这些子视图中获取值。但是由于我的 inflation 代码在适配器中,我需要知道如何从我的适配器本身检测页面更改。
这是我的适配器代码:-
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;
}
我按如下方式将适配器传递给我的 ViewPager:-
mViewPager.Adapter = new PollViewPagerAdapter(this, this.FragmentManager, AppHelper.SelectedVotes);
如何检测页面更改并从 RadioGroup
、Checkbox
和 EditText
获取值?感谢您的帮助。
您不需要知道页面何时在适配器内滚动。您可以像这样将页面滚动侦听器分配给寻呼机:
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 和你的适配器之间创建一个接口来监听无线电组状态变化之类的事件。
编辑
让我尝试进一步阐述。你的问题没有正确答案。您可以通过多种方式实现这种行为。假设您的适配器中有一个无线电组,带有一个已检查的更改侦听器。例如,在已检查的更改方法中,您可以调用您在适配器中定义的一些接口方法。
interface RadioChangedListener{
fun radioChanged(radioId: Int)
}
在适配器中定义此接口并让您的 fragment/activity 实现它。然后在构造函数中声明适配器将其传递给 activity/fragment 作为 radioChangedListener 对象:
class YourAdapter(var listItems: MutableList<YourItem>, val yourListener: RadioChangedListener)
: RecyclerView.Adapter<YourAdapter.YourHolder>() {
//...adapter code
}
最后,在你的广播组监听器中,你可以像这样调用你的接口方法(给你 Java 代码,因为我很懒):
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.yourRadioGroup);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
yourListener.radioChanged(checkedId)
}
});
这将触发 activity 中的 radioChanged
方法,您可以在其中存储您的值。
我有一个带有 ViewPager
的 Activity
和一个实现 PagerAdaper
的自定义适配器。我在 PagerAdapter
中膨胀一个视图并将子视图添加到父视图。这些子视图是 RadioGroup
、Checkboxes
、EditText
等,具体取决于我将其列表传递给适配器的对象的特定参数。
我想在页面更改后从这些子视图中获取值。但是由于我的 inflation 代码在适配器中,我需要知道如何从我的适配器本身检测页面更改。
这是我的适配器代码:-
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;
}
我按如下方式将适配器传递给我的 ViewPager:-
mViewPager.Adapter = new PollViewPagerAdapter(this, this.FragmentManager, AppHelper.SelectedVotes);
如何检测页面更改并从 RadioGroup
、Checkbox
和 EditText
获取值?感谢您的帮助。
您不需要知道页面何时在适配器内滚动。您可以像这样将页面滚动侦听器分配给寻呼机:
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 和你的适配器之间创建一个接口来监听无线电组状态变化之类的事件。
编辑
让我尝试进一步阐述。你的问题没有正确答案。您可以通过多种方式实现这种行为。假设您的适配器中有一个无线电组,带有一个已检查的更改侦听器。例如,在已检查的更改方法中,您可以调用您在适配器中定义的一些接口方法。
interface RadioChangedListener{
fun radioChanged(radioId: Int)
}
在适配器中定义此接口并让您的 fragment/activity 实现它。然后在构造函数中声明适配器将其传递给 activity/fragment 作为 radioChangedListener 对象:
class YourAdapter(var listItems: MutableList<YourItem>, val yourListener: RadioChangedListener)
: RecyclerView.Adapter<YourAdapter.YourHolder>() {
//...adapter code
}
最后,在你的广播组监听器中,你可以像这样调用你的接口方法(给你 Java 代码,因为我很懒):
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.yourRadioGroup);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
yourListener.radioChanged(checkedId)
}
});
这将触发 activity 中的 radioChanged
方法,您可以在其中存储您的值。