如何在自定义 ListView 适配器中处理 RadioGroup 的 onCheckedChangeListener
Posted
技术标签:
【中文标题】如何在自定义 ListView 适配器中处理 RadioGroup 的 onCheckedChangeListener【英文标题】:How to handle onCheckedChangeListener for a RadioGroup in a custom ListView adapter 【发布时间】:2012-03-12 15:30:14 【问题描述】:我正在开发一个具有自定义布局的列表视图的应用程序,如下所示:
它在RadioGroup
中有4 个RadioButtons
和一个TextView
。实际上,它会显示为 question(TextView
) 和 answers(RadioButtons
) 列表。上面的视图在我的扩展 ArrayAdapter<Question>
的自定义适配器中膨胀。
问题是,我应该如何在我的自定义Adapter
中维护RadioButtons
的状态?当RadioButton
是pressed/checked
并且列表向下滚动时,adapter
自动回收视图并且RadioButton
状态丢失。
我关注的文章: http://www.vogella.de/articles/androidListView/article.html.
上面的链接使用CheckBox
,类似地我想使用RadioGroup
(RadioButtons
) 而不是CheckBoxes
。
【问题讨论】:
【参考方案1】:修改该教程很容易,因此您可以使用RadioGroup
而不是CheckBox
。贝娄是一个例子(我使用了一个RadioGroup
和 4 个RadioButton
)。首先,您必须修改 Model
类,以便它可以保存新数据:
public class Model
String question; // hold the question
int current = NONE; // hold the answer picked by the user, initial is NONE(see below)
public static final int NONE = 1000; // No answer selected
public static final int ANSWER_ONE_SELECTED = 0; // first answer selected
public static final int ANSWER_TWO_SELECTED = 1; // second answer selected
public static final int ANSWER_THREE_SELECTED = 2; // third answer selected
public static final int ANSWER_FOUR_SELECTED = 3; // forth answer selected
public Model(String question)
this.question = question;
然后修改getView()
方法,根据模型设置视图:
@Override
public View getView(int position, View convertView, ViewGroup parent)
View v = convertView;
ViewHolder holder = null;
if (v == null)
v = inflater.inflate(R.layout.the_row, parent, false);
holder = new ViewHolder(v);
v.setTag(holder);
holder.group
.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
public void onCheckedChanged(RadioGroup group,
int checkedId)
Integer pos = (Integer) group.getTag(); // To identify the Model object i get from the RadioGroup with getTag()
// an integer representing the actual position
Model element = list.get(pos);
switch (checkedId) //set the Model to hold the answer the user picked
case R.id.answer0:
element.current = Model.ANSWER_ONE_SELECTED;
break;
case R.id.answer1:
element.current = Model.ANSWER_TWO_SELECTED;
break;
case R.id.answer2:
element.current = Model.ANSWER_THREE_SELECTED;
break;
case R.id.answer3:
element.current = Model.ANSWER_FOUR_SELECTED;
break;
default:
element.current = Model.NONE; // Something was wrong set to the default
);
else
holder = (ViewHolder) v.getTag();
holder.group.setTag(new Integer(position)); // I passed the current position as a tag
holder.t.setText(list.get(position).question); // Set the question body
if (list.get(position).current != Model.NONE)
RadioButton r = (RadioButton) holder.group.getChildAt(list
.get(position).current);
r.setChecked(true);
else
holder.group.clearCheck(); // This is required because although the Model could have the current
// position to NONE you could be dealing with a previous row where
// the user already picked an answer.
return v;
然后ViewHolder
类:
class ViewHolder
TextView t = null;
RadioGroup group;
ViewHolder(View v)
t = (TextView) v.findViewById(R.id.textView1);
group = (RadioGroup) v.findViewById(R.id.group_me);
带有RadioGroup
的xml布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_ />
<RadioGroup
android:id="@+id/group_me"
android:layout_
android:layout_
android:orientation="horizontal" >
<RadioButton
android:id="@+id/answer0"
android:layout_
android:layout_
android:checked="false"
android:text="Ans0" />
<RadioButton
android:id="@+id/answer1"
android:layout_
android:layout_
android:checked="false"
android:text="Ans1" />
<RadioButton
android:id="@+id/answer2"
android:layout_
android:layout_
android:checked="false"
android:text="Ans2" />
<RadioButton
android:id="@+id/answer3"
android:layout_
android:layout_
android:checked="false"
android:text="Ans3" />
</RadioGroup>
</LinearLayout>
【讨论】:
你能告诉我更多关于“Model element = list.get(pos);”这一行 @rohit 通常OnCheckedChangeListener
不知道用户检查的列表中元素的位置。所以我们设置了一个TAG
对象(一个整数),表示您从getView()
方法获得的位置,然后在Model element = list.get(pos);
行上,我们得到与用户检查的实际位置相对应的模型元素。这就像那个教程的 8. 部分,但是我们没有直接传递模型对象,而是将位置设置为标记,然后根据该位置检索模型对象。
我将我的问题对象列表复制到模型对象列表中并且有效.. thx :)以上是关于如何在自定义 ListView 适配器中处理 RadioGroup 的 onCheckedChangeListener的主要内容,如果未能解决你的问题,请参考以下文章
listview 项目未在自定义适配器的 getview 方法中显示分配的值
为 listview 定义 onlick:在 listView 级别的 Onclick 与自定义视图适配器内的 Onclick
如何在自定义 ListView 中获取 EditText 的所有值
在自定义 ListView 适配器中执行 findViewById() 时发生 NullPointerException