本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作。通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项。
[1] 程序结构图如下:
其中Person.java是实体类,MainActivity.java是Activity组件类。listitem.xml是自定义的列表每项布局文件。
[2] listitem.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">
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:descendantFocusability="blocksDescendants">
- <CheckBox
- android:id="@+id/list.select"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"/>
- <TextView
- android:id="@+id/list.name"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="Name"
- android:layout_gravity="center"
- android:textSize="20dp"
- android:layout_marginLeft="10dp"/>
- <TextView
- android:id="@+id/list.address"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="Address"
- android:layout_gravity="center"
- android:textSize="20dp"/>
- </LinearLayout>
- </LinearLayout>
[3] 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">
- <Button
- android:id="@+id/show"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Show"/>
- <ListView
- android:id="@+id/lvperson"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- </LinearLayout>
[4] Person.java实体类源码如下:
- package com.andyidea.bean;
- public class Person {
- private String name;
- private String address;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
[5] MainActivity.java类源码如下:
- package com.andyidea.listview;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import com.andyidea.bean.Person;
- import android.app.Activity;
- import android.app.AlertDialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.CheckBox;
- import android.widget.ListView;
- import android.widget.TextView;
- public class MainActivity extends Activity {
- Button show;
- ListView lv;
- List<Person> persons = new ArrayList<Person>();
- Context mContext;
- MyListAdapter adapter;
- List<Integer> listItemID = new ArrayList<Integer>();
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mContext = getApplicationContext();
- show = (Button)findViewById(R.id.show);
- lv = (ListView)findViewById(R.id.lvperson);
- initPersonData();
- adapter = new MyListAdapter(persons);
- lv.setAdapter(adapter);
- show.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- listItemID.clear();
- for(int i=0;i<adapter.mChecked.size();i++){
- if(adapter.mChecked.get(i)){
- listItemID.add(i);
- }
- }
- if(listItemID.size()==0){
- AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
- builder1.setMessage("没有选中任何记录");
- builder1.show();
- }else{
- StringBuilder sb = new StringBuilder();
- for(int i=0;i<listItemID.size();i++){
- sb.append("ItemID="+listItemID.get(i)+" . ");
- }
- AlertDialog.Builder builder2 = new AlertDialog.Builder(MainActivity.this);
- builder2.setMessage(sb.toString());
- builder2.show();
- }
- }
- });
- }
- /**
- * 模拟数据
- */
- private void initPersonData(){
- Person mPerson;
- for(int i=1;i<=12;i++){
- mPerson = new Person();
- mPerson.setName("Andy"+i);
- mPerson.setAddress("GuangZhou"+i);
- persons.add(mPerson);
- }
- }
- //自定义ListView适配器
- class MyListAdapter extends BaseAdapter{
- List<Boolean> mChecked;
- List<Person> listPerson;
- HashMap<Integer,View> map = new HashMap<Integer,View>();
- public MyListAdapter(List<Person> list){
- listPerson = new ArrayList<Person>();
- listPerson = list;
- mChecked = new ArrayList<Boolean>();
- for(int i=0;i<list.size();i++){
- mChecked.add(false);
- }
- }
- @Override
- public int getCount() {
- return listPerson.size();
- }
- @Override
- public Object getItem(int position) {
- return listPerson.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view;
- ViewHolder holder = null;
- if (map.get(position) == null) {
- Log.e("MainActivity","position1 = "+position);
- LayoutInflater mInflater = (LayoutInflater) mContext
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- view = mInflater.inflate(R.layout.listitem, null);
- holder = new ViewHolder();
- holder.selected = (CheckBox)view.findViewById(R.id.list_select);
- holder.name = (TextView)view.findViewById(R.id.list_name);
- holder.address = (TextView)view.findViewById(R.id.list_address);
- final int p = position;
- map.put(position, view);
- holder.selected.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- CheckBox cb = (CheckBox)v;
- mChecked.set(p, cb.isChecked());
- }
- });
- view.setTag(holder);
- }else{
- Log.e("MainActivity","position2 = "+position);
- view = map.get(position);
- holder = (ViewHolder)view.getTag();
- }
- holder.selected.setChecked(mChecked.get(position));
- holder.name.setText(listPerson.get(position).getName());
- holder.address.setText(listPerson.get(position).getAddress());
- return view;
- }
- }
- static class ViewHolder{
- CheckBox selected;
- TextView name;
- TextView address;
- }
- }
[6] 程序运行后的结果如下: