Android中ListView結合CheckBox判斷選中項

             本文主要實現在自定義的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] 程序運行後的結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章