Android 通过listView+RadioButton实现列表的单选功能
项目里面有个页面需要使用listVIew列表中含有单选按钮,于是就动手写一个,在item中添加了一个RadioButton,运行app后,发现了一个问题,就是在列表中选中了一列,滑动后会发现其他列也会有选中的情况,这不是我想要的效果。在网上查找了一下,发现原来LIstView存在复用之前对象的情况,后来也找到了解决问题的方法,分享一下。
未修改之前:
1、MainActivity的代码,主要用来实例化listView对象,初始化模拟数据,调用适配器将模拟数据显示在listView上
public class MainActivity extends Activity {
//创建显示列表的listView
private ListView listView;
//列表标题list
private List<String> listText;
//创建适配器对象
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化页面对象
init();
//将数据显示在页面上
initDate();
}
public void init(){
listView=(ListView) findViewById(R.id.lv_text_view);
listText=new ArrayList<String>();
}
public void initDate(){
//模拟创建数据
for (int i=0;i<60;i++){
listText.add("单选按钮标题"+i);
}
adapter=new MyAdapter(listText,this);
listView.setAdapter(adapter);
}
}
2、MainActivity页面布局 activity_main.xml ,我这里面就添加了一个listView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns: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"
tools:context="com.hz.loginapp.MainActivity">
<ListView
android:id="@+id/lv_text_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
3、listView的item布局list_view_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_radio_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2.0"
android:text="名称"
android:textColor="#ff323232"
android:textSize="16sp"
android:typeface="monospace" />
<RadioButton
android:id="@+id/rb_radio_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:text="" />
</LinearLayout>
4、listView的适配器
public class MyAdapter extends BaseAdapter {
private List<String> listText;
private Context context;
// 用于记录每个RadioButton的状态,并保证只可选一个
HashMap<String, Boolean> states = new HashMap<String, Boolean>();
public MyAdapter(List<String> listText,Context context){
this.listText=listText;
this.context=context;
}
@Override
public int getCount() {
//return返回的是int类型,也就是页面要显示的数量。
return listText.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view;
if (convertView==null){
//通过一个打气筒 inflate 可以把一个布局转换成一个view对象
view=View.inflate(context,R.layout.list_view_item,null);
}else {
view=convertView;//复用历史缓存对象
}
//单选按钮的文字
TextView radioText=(TextView)view.findViewById(R.id.tv_radio_text);
//单选按钮
RadioButton radioButton=(RadioButton)view.findViewById(R.id.rb_radio_button);
radioText.setText(listText.get(position));
radioButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 重置,确保最多只有一项被选中
for (String key : states.keySet()) {
states.put(key, false);
}
states.put(String.valueOf(position), true);
MyAdapter.this.notifyDataSetChanged();
}
});
boolean res = false;
if (states.get(String.valueOf(position)) == null|| states.get(String.valueOf(position)) == false) {
res = false;
states.put(String.valueOf(position), false);
} else
res = true;
radioButton.setChecked(res);
return view;
}
这样就单选按钮多选中的问题就解决了。
修改之后的listView