ListView实现RadioButton的单选效果
首先需要面对的问题:
1,Android自带的RadioButton单选框只支持添加文字,如果要实现更加复杂的item,由于每个RadioButton不在同级ViewGroup,所以单选效果不能实现
2,ListView的.getChildAt(index)方法只能获取当前屏幕中显示的item,如果item个数超过屏幕范围会返回null,其结果是灾难性的
解决了这两个问题下面就好办了
Item字条目布局,这里用CheckBox实现,当然你也可以自己改成RadioButton,效果是一样的:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <CheckBox android:id="@+id/check_box" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="0dp" android:layout_centerVertical="true" android:checked="false" style="@style/CustomCheckboxTheme" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/check_box_passenger_left" android:layout_centerInParent="true" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" android:layout_alignParentRight="true" /> </RelativeLayout>
这里我加了一个自定义的选择风格来改变CheckBox的选择样式,没兴趣的可以跳过直接看下面的java代码
CheckBox中引用的style CustomCheckboxTheme
<style name="CustomCheckboxTheme" parent="@android:style/Widget.CompoundButton.CheckBox"> <item name="android:button">@drawable/checkbox_style</item> </style>
checkbox_style选择器
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/air_ticket_check_box_ischecked" android:state_checked="true"/> <item android:drawable="@drawable/air_ticket_check_box_without_checked" android:state_checked="false"/> <item android:drawable="@drawable/air_ticket_check_box_without_checked"/> </selector>
Java代码部分
解决方案:
实现单选效果的方式就是遍历ListView的子条目,将已经选择过的item状态置为false,然后将当前选中item的状态置为true
为避免获取的item为null,定义一个集合纪录每个item,以保证获取到的是该item上的View
public class MainActivity extends Activity { Context mContext = this; private ListView lv_radio_select; List<View> list = new ArrayList<View>();//用来记录listView的每个item @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_radio_select = (ListView) findViewById(R.id.lv_radio_select); lv_radio_select.setAdapter(new MyAdapter()); } ArrayList<String> initData() {//假数据 ArrayList<String> data = new ArrayList<String>(); for (int i = 0; i < 20; i++) { data.add("item" + i); } return data; }
//适配器 class MyAdapter extends BaseAdapter{ ArrayList<String> data = initData(); @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final Holder holder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item_check, parent, false); holder = new Holder(); holder.check = (CheckBox) convertView.findViewById(R.id.check_box); holder.text = (TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(holder); }else{ holder = (Holder) convertView.getTag(); } holder.text.setText(data.get(position)); holder.check.setOnClickListener(new OnClickListener() { //实现单选的逻辑 @Override public void onClick(View v) { // TODO for (int i = 0; i < data.size(); i++) { View item = list.get(i); CheckBox check = (CheckBox) item.findViewById(R.id.check_box); if (check.isChecked()) { check.setChecked(false); } } holder.check.setChecked(true); } }); list.add(convertView);//纪录 return convertView; } class Holder{ CheckBox check; TextView text; } }
一个简单的ListView单选效果就实现了,下面是运行效果