许久没有写过博客了,近来在做Android开发,突然想到这里,以后可以在这里贴些代码,做些记录,与大家分享交流。Android开发中,常常会用到RadioButton与ListView的混合使用,用户点击一条Item,然后记录下选中的状态,其中最重要的是记录好用户点击选中Item的位置。

布局文件很简单:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="@string/select_authors"android:textSize="25sp"/><ListViewandroid:id="@+id/list"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"/></LinearLayout>

ItemList也不复杂:

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/author"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:text="@string/author_name"android:textSize="20sp"/><RadioButtonandroid:id="@+id/radio"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"/></RelativeLayout>

RadioButtonList类,这里我写了一些自己喜欢的作家(当然我也很喜欢和大家交流一些文学作品)作为模拟数据。

packagecom.example.radiobuttonlisttest;importandroid.app.Activity;importandroid.os.Bundle;importandroid.widget.ListView;publicclassRadioButtonListextendsActivity{privateListViewradioButtonList;privateRadioAdapteradapter;//模拟几个数据,作为List的条目privateString[]authors={"芥川龙之介","三岛由纪夫","川端康成","村上春树","东野圭吾","张爱玲","金庸","钱钟书","老舍","梁实秋","亨利米勒","海明威","菲兹杰拉德","凯鲁亚克","杰克伦敦","小仲马","杜拉斯","福楼拜","雨果","巴尔扎克","莎士比亚","劳伦斯","毛姆","柯南道尔","笛福"};@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_radio_button_list);radioButtonList=(ListView)findViewById(R.id.list);adapter=newRadioAdapter(this,authors);radioButtonList.setAdapter(adapter);}}

适配器是最关键的,标记好选择的位置,选中状态不会因为ListView的滑动而出现混乱:

packagecom.example.radiobuttonlisttest;importandroid.content.Context;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.CompoundButton;importandroid.widget.CompoundButton.OnCheckedChangeListener;importandroid.widget.RadioButton;importandroid.widget.TextView;importandroid.widget.Toast;publicclassRadioAdapterextendsBaseAdapter{privateLayoutInflaterinflater;privateString[]authors;privateviewHolderholder;//标记用户当前选择的那一个作家privateintindex=-1;privateContextc;publicRadioAdapter(Contextc,String[]authors){super();this.c=c;this.authors=authors;inflater=LayoutInflater.from(c);}@OverridepublicintgetCount(){returnauthors.length;}@OverridepublicObjectgetItem(intposition){returnnull;}@OverridepubliclonggetItemId(intposition){return0;}@OverridepublicViewgetView(finalintposition,ViewconvertView,ViewGroupparent){holder=newviewHolder();if(convertView==null){convertView=inflater.inflate(R.layout.item_list,null);holder.nameTxt=(TextView)convertView.findViewById(R.id.author);holder.selectBtn=(RadioButton)convertView.findViewById(R.id.radio);convertView.setTag(holder);}else{holder=(viewHolder)convertView.getTag();}holder.nameTxt.setText(authors[position]);holder.selectBtn.setOnCheckedChangeListener(newOnCheckedChangeListener(){@OverridepublicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){if(isChecked){Toast.makeText(c,"您选择的作家是:"+authors[position],Toast.LENGTH_LONG).show();index=position;notifyDataSetChanged();}}});if(index==position){//选中的条目和当前的条目是否相等holder.selectBtn.setChecked(true);}else{holder.selectBtn.setChecked(false);}returnconvertView;}publicclassviewHolder{publicTextViewnameTxt;publicRadioButtonselectBtn;}}

最后看看效果图: