之前做一个个人项目的时候在listview中加入了checkbox控件,但是发现选择一个checkbox之后,其余某个checkbox也会被选择,经过6个小时的努力终于解决了这个问题。
要解决这个问题我们就要了解首先安卓的listview是有缓存和复用机制的,关于这点如果不了解的话可以点击这个链接,里面有浅显易懂的解释:
http://blog.csdn.net/lovehong0306/article/details/7498025
(注意:这个链接是转载的,感谢原作者)
之所以会出现checkbox之间选择之后相互关联就是因为这个复用机制再捣乱。
所以现在我们要做的就是手动的保存下每个checkbox是否被选择的状态,当系统调用getView显示checkbox的时候通过我们自己保存下的状态来决定checkbox应该被设置选中还是未选中。在代码中我选择使用ArrayList来保存checkbox的选中状态。
下面是代码:
1.主activity
<pre name="code" class="java">package com.Dropout.Four;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.appcompat.R.integer;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class BuyActivity extends Activity {
private Button bt_ok;
private Button bt_cancel;
private ListView lv;
public static ArrayList<Boolean> list_bool;
private MyAdapter ma;
private List<Map<String,String>> list =new ArrayList<Map<String,String>>();
private SimpleAdapter sa =null;
private ArrayList<Boolean> checked=new ArrayList<Boolean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_buy);
for(int i=0;i<(MainActivity.list).size();i++){
checked.add(false);
}
//初始化list_booli
list_bool = new ArrayList<Boolean>();
for (int i = 0;i<MainActivity.list.size();i++){
list_bool.add(false);
}
bt_ok = (Button)findViewById(R.id.button1);
bt_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent in=new Intent(BuyActivity.this,BuyingActivity.class);
BuyActivity.this.finish();
BuyActivity.this.startActivity(in);
}
});
bt_cancel = (Button)findViewById(R.id.button2);
bt_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
BuyActivity.this.finish();
}
});
lv =(ListView)findViewById(R.id.listView1);
ma = new MyAdapter(BuyActivity.this,R.layout.choose_buy,MainActivity.list);
lv.setAdapter(ma);
/*
for (int i =0; i<MainActivity.tot_people;i++){
Map<String,String> map = new HashMap<String,String>();
map.put("name",MainActivity.list.get(i));
list.add(map);
}
sa = new SimpleAdapter(this,
list,
R.layout.choose_buy,
new String[]{"name"},
new int[]{R.id.checkBox1});
lv.setAdapter(sa);
*/
}
private class MyAdapter extends ArrayAdapter<String>{
private int resource;
public MyAdapter(Context context,int resourceId, ArrayList<String> s) {
super(context,resourceId,s);
resource = resourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
convertView=BuyActivity.this.getLayoutInflater().inflate(R.layout.choose_buy, null);
}
CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkBox1);
cb.setText(MainActivity.list.get(position));
cb.setChecked(checked.get(position));
cb.setOnClickListener(new MyListener(position));
return convertView;
}
private class MyListener implements OnClickListener{
private int key;
public MyListener(int key){
this.key=key;
}
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
if(!checked.get(key)){
checked.set(key,true);
return;
}
if(checked.get(key)){
checked.set(key,false);
return;
}
}
}
}
}
</pre><pre name="code" class="java">
2.定义了checkbox的布局文件:
<?xml version="1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/myLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="0.42"
android:text="CheckBox"
/>
</LinearLayout>
3.主Activity的布局文件:
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/AbsoluteLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.Dropout.Four.BuyActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="13dp"
android:layout_y="12dp"
android:text="请选择参与本次消费的成员:" />
<ListView
android:id="@+id/listView1"
android:layout_width="223dp"
android:layout_height="312dp"
android:layout_x="29dp"
android:layout_y="38dp" >
</ListView>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="53dp"
android:layout_y="378dp"
android:text="确定" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="168dp"
android:layout_y="378dp"
android:text="返回" />
</AbsoluteLayout>