我想在列表中显示一个选择选项。我在RadioButton
行中使用了listView
。我知道RadioGroup
用于单一选择。
但问题是我在RadioButton
添加了ListRowView
。现在我想在一个RadioButton
中添加所有列表项。我正在使用Custom Adapter
和getView()
。我在RadioButton
中获得getView()
,但是当想要在RadioGroup
中添加时,请说
“视图已经有父级,在”
之前调用父级中的removeView()
我知道它是真的,但如果我从视图中删除它。然后它就不可见了。
我还尝试以编程方式创建和添加RadioButton
。然后将其添加到RadioGrop
中。然后查看列表行。但这一次,因为父母是RadioGroup
,所以再说它
“视图已经有父级,在”
之前调用父级中的removeView()
我想要做的是一次只选择列表中的一个项目。我的代码如下。
public class MyAdapter extends ArrayAdapter < MyMenuItem > {
private LayoutInflater mInflater ;
int mResource ;
List < MyMenuItem > mData ;
Context context;
public MyAdapter ( Context context , int resource , int textViewResourceId , List < MyMenuItem > data ) {
super ( context , resource , textViewResourceId , data ) ;
this.context = context;
mData = data ;
mResource = resource ;
mInflater = ( LayoutInflater ) getSystemService ( Context.LAYOUT_INFLATER_SERVICE ) ;
}
@ Override
public View getView ( int position , View convertView , ViewGroup parent ) {
ViewHolder holder = null ;
if ( convertView == null ) {
convertView = mInflater.inflate ( mResource , null ) ;
holder = new ViewHolder ( ) ;
holder.icon = ( ImageView ) convertView.findViewById ( R.id.icon ) ;
holder.text = ( TextView ) convertView.findViewById ( R.id.text ) ;
holder.comment = ( TextView ) convertView.findViewById ( R.id.comment ) ;
LinearLayout lin = ( LinearLayout ) convertView.findViewById ( R.id.linerList ) ;
RadioButton rbtn = new RadioButton ( context );
LayoutParams lparam = new LayoutParams ( LayoutParams.WRAP_CONTENT , LayoutParams.WRAP_CONTENT );
rbtn.setSelected ( false );
holder.check = rbtn;
//radioGroup.addView ( rbtn );
lin.addView ( rbtn , 0 );
convertView.setTag ( holder ) ;
} else {
holder = ( ViewHolder ) convertView.getTag ( ) ;
}
holder.text.setText ( mData.get ( position ).getText ( ) ) ;
holder.comment.setText ( mData.get ( position ).getComment ( ) ) ;
holder.icon.setImageResource ( getApplicationContext ( ).getResources ( ).getIdentifier ( mData.get ( position ).getIcon ( ) ,
"drawable" , getPackageName ( ) )
) ;
return convertView ;
}
}
我的行
的XML<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<LinearLayout
android:id = "@+id/linerList"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="6dip" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="My Application"
android:textSize="20sp"
android:singleLine="true"
android:ellipsize="marquee"
android:textColor="@color/white" />
<TextView
android:id="@+id/comment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
android:text="Simple application that shows how to use RelativeLayout"
android:textSize="14sp"
android:textColor="@color/light_gray" />
</LinearLayout>
答案 0 :(得分:46)
你需要做两件事:
mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Checkable
。 (有关此here的更多信息)。答案 1 :(得分:36)
此解决方案有效且非常干净,但可能会有更好的解决方案。
您应该使用适配器来管理单选按钮状态。
您必须保留对最后检查的单选按钮的引用,然后在RadioButton.onClick
上设置上次选中的单选按钮setChecked(false)
。
还记得将新选择的单选按钮设置为最后选择的单选按钮。
参见示例:
private class MyAdapter extends ArrayAdapter<String>{
private int mResourceId = 0;
private LayoutInflater mLayoutInflater;
private RadioButton mSelectedRB;
private int mSelectedPosition = -1;
public MyAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
super(context, resource, textViewResourceId, objects);
mResourceId = resource;
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
ViewHolder holder;
if(view == null){
view = mLayoutInflater.inflate(mResourceId, parent, false);
holder = new ViewHolder();
holder.name = (TextView)view.findViewById(R.id.text);
holder.radioBtn = (RadioButton)view.findViewById(R.id.radioButton1);
view.setTag(holder);
}else{
holder = (ViewHolder)view.getTag();
}
holder.radioBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(position != mSelectedPosition && mSelectedRB != null){
mSelectedRB.setChecked(false);
}
mSelectedPosition = position;
mSelectedRB = (RadioButton)v;
}
});
if(mSelectedPosition != position){
holder.radioBtn.setChecked(false);
}else{
holder.radioBtn.setChecked(true);
if(mSelectedRB != null && holder.radioBtn != mSelectedRB){
mSelectedRB = holder.radioBtn;
}
}
holder.name.setText(getItem(position));
return view;
}
private class ViewHolder{
TextView name;
RadioButton radioBtn;
}
}
希望它适合你。
答案 2 :(得分:14)
这是我的解决方案。它非常简单。
my_radio_adapter_item.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
... />
<RadioButton
android:id="@+id/radio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"
... />
</LinearLayout>
MyRadioAdapter.java
public class MyRadioAdapter extends BaseAdapter
{
private Context mContext;
private ArrayList<Variation> mVariations;
private int mSelectedVariation;
public MyRadioAdapter(Context context, ArrayList<Variation> variations, int selectedVariation)
{
mContext = context;
mVariations = variations;
mSelectedVariation = selectedVariation;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
View view = convertView;
if(view==null)
{
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_radio_adapter_item, null);
}
final Variation variation = mVariations.get(position);
TextView name = (TextView) view.findViewById(R.id.name);
RadioButton radio = (RadioButton) view.findViewById(R.id.radio);
name.setText(variation.getName());
if(position==mSelectedVariation) radio.setChecked(true);
else radio.setChecked(false);
view.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
mSelectedVariation = position;
MyRadioAdapter.this.notifyDataSetChanged();
}
});
return view;
}
...
}
答案 3 :(得分:2)
你可以放一个
private int selectedIndex = -1;
然后,在getView代码中,您可以检查
if (position == selectedIndex) {
rbtn.setSelected ( true );
}
else {
rbtn.setSelected ( false );
}
并在自定义适配器中添加方法:
public void setSelectedIndex(int index) {
//some range-checks, maybe
selectedIndex = index;
//invalidate
}
然后,在你的onItemClickedListener中,你在该位置上调用setSelectedIndex。
答案 4 :(得分:1)
您需要使用CheckedTextView而不是普通的CheckedTextView。 http://developer.android.com/reference/android/widget/CheckedTextView.html
我从未使用它,但AlertDialog将它用于SingleChoice项目。所以它最终将起作用:)
编辑: 别忘了打电话
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
答案 5 :(得分:0)
要添加已经给出的答案,对于更模块化的方法,让所有列表项继承自具有消息功能的相同类/接口,该消息功能允许您通过适配器将按摩传递给它们。 适配器将自己注册到添加到其中的每个项目,因此每个列表项都可以调用适配器来发送消息。 然后,在RadioButton监听器中,您可以向所有其他单选按钮发送消息以关闭,打开按下的按钮,然后最终通知适配器上更改的数据集。
我有一个ListAdapter类和一个相当健壮的ListItem抽象类;我会发送给任何需要它的人 支持多种列表项类型。
答案 6 :(得分:0)
您可以尝试此解决方案。定义一个变量以获取当前选定的位置,然后在自定义适配器中执行以下操作。
singleRadio.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
checkedButtonPosition = position;
notifyDataSetChanged();
}
});
if (checkedButtonPosition == position){
singleRadio.setChecked(true);
}else {
singleRadio.setChecked(false);
}
答案 7 :(得分:-1)
你需要相同的输出或不同......
我的意思是你只从列表中选择一种语言。是不是?
遵守它。所以我将举一个例子