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单选效果就实现了,下面是运行效果

 

posted on 2014-12-02 11:18  hwren  阅读(668)  评论(0编辑  收藏  举报

导航