无意中在网上看到了ListView带CheckBox会出现多选或者少选的问题, 于是自己写了个demo研究下!
其中我屏蔽了checkBox的点击和焦点, 改变checkBox的状态由点击ListView的item来完成!
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:choiceMode="singleChoice"
/>
</LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/tv"
/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:focusable="false"
android:clickable="false"
android:id="@+id/checkBox"
/>
</LinearLayout>
MainActivity.java
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = (ListView)findViewById(R.id.listView);
final List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
for(int i = 1; i <= 100; i++) {
Map<String, Object> item = new HashMap<String, Object>();
item.put("name", "name:" + i);
item.put("check", i % 2 == 0);
data.add(item);
}
final SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.list_item,
new String[]{"name", "check"}, new int[]{R.id.tv, R.id.checkBox});
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
CheckBox ck = (CheckBox)view.findViewById(R.id.checkBox);
Log.e("MainActivity", String.valueOf(ck.isChecked()));
//ck.setChecked(!ck.isChecked());
SimpleAdapter sa = (SimpleAdapter)parent.getAdapter();
((Map<String, Object>)sa.getItem(position)).put("check", !ck.isChecked());
sa.notifyDataSetChanged();
}
});
}
}
运行, 没有出现重复选和错位的问题啊, 不知道是不是android修复了这个问题!
网上很多人有遇到错位的问题, 那么就需要重写Adapter的getView, 自己定义一个ViewHandler, 里面包含list_item中的控件
private final class ViewHandler {
TextView tv;
CheckBox ck;
}
重写Adapter的getView
public View getView(int position, View convertView,
ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, null);
holder.nameText = (TextView)convertView.findViewById(R.id.tv);
holder.ck = (CheckBox)convertView.findViewById(R.id.checkBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
Log.d("MainActivity", String.valueOf(data.get(position).get("check")));
holder.ck.setChecked((Boolean)data.get(position).get("check"));
return super.getView(position, convertView, parent);
}