最近做帶CheckBox的LISTVIEW的實現,在實現過程中遇到一些問題,也參考了一些網上資料,功能已經實現,在此做個記錄,方便大家參考。
首先建立一個工程,然後修改main.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="fill_parent" android:orientation="vertical" > <Button android:id="@+id/select_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text = "SelectAll" /> <!-- android:listSelector="@android:color/transparent"可以去掉點擊時預設的黃色背景 android:divider="@android:color/transparent"可以去掉預設的分割線 這兩個設定了後就可以換成自己的背景了。 --> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/list" android:layout_alignParentTop="true" /></LinearLayout> 然後需要自己寫一個ListView每項的布局檔案,我寫了一個簡單的listview_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="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dip" android:textSize="12dip" /> <RelativeLayout android:layout_width="match_parent"android:layout_height="wrap_content" > <CheckBox android:id="@+id/listcb" android:layout_width="30dp" android:layout_height="27dp"android:layout_marginRight="5dip" android:layout_alignParentRight="true"android:gravity="center_vertical"android:focusable="false"android:clickable="false"android:focusableInTouchMode="false" android:button="@android:color/transparent"android:background="@drawable/music_listview_checkbox"/></RelativeLayout> </LinearLayout>
再呢?需要給ListView自訂一個ADAPTER,ListViewAdapter.java,對於處理CheckBox的地方我有加註釋。
package com.wm.example;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.TextView;public class ListViewAdapter extends BaseAdapter {private List<String> mData = new ArrayList<String>();// private Context mContext; LayoutInflater mInflater; // 用來控制CheckBox的選中狀況 private HashMap<Integer,Boolean> isSelected; public ListViewAdapter(LayoutInflater inflater,Context mcontext,List<String> mdata) {mInflater = inflater;//mContext = mcontext;isSelected = new HashMap<Integer,Boolean>();mData = mdata;initSelectedMap();} public void initSelectedMap(){//預設全部未勾選狀態。for(int i = 0; i< mData.size();++i){isSelected.put(i, false);}}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn mData.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mData.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View v;ViewTag mViewTag = new ViewTag();// TODO Auto-generated method stubv = mInflater.inflate(R.layout.listview_item, null);mViewTag.mTextView = (TextView) v.findViewById(R.id.name);String mText = mData.get(position);if(mText != null){mViewTag.mTextView.setText(mData.get(position));}else{mViewTag.mTextView.setText("Unknown name");}mViewTag.mCheckBox = (CheckBox) v.findViewById(R.id.listcb);//According to the saved status and setChecked status mViewTag.mCheckBox.setChecked(isSelected.get(position));v.setTag(mViewTag);return v;}public void setListViewData(List<String> mList){mData = mList;}public void setItemCheckBoxStatus(View mView,int index){ViewTag holder = (ViewTag) mView.getTag(); // 改變CheckBox的狀態 holder.mCheckBox.toggle(); // 將CheckBox的選中狀況記錄下來 isSelected.put(index, holder.mCheckBox.isChecked()); }public void setAllCheckBoxStatus(Boolean mFlag){for(int i= 0;i < mData.size(); ++i){isSelected.put(i, mFlag);}}public class ViewTag{public TextView mTextView;public CheckBox mCheckBox;}}
最後,更該首頁面的代碼,這裡我多做了一個實現全選與不全選的控制功能。
package com.wm.example;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;public class ListViewCheckboxActivity extends Activity implements OnClickListener,OnItemClickListener{private static final String TAG="ListViewCheckboxActivity";private Button mBtn;private ListViewmListView;private ListViewAdapter mListViewAdapter = null;private List<String>mData = new ArrayList<String>();//control select button status(SelectedAll or UnselectAll)privateBooleanmAllSelected = false;private HashMap<Integer,Boolean> mCheckedObj = new HashMap<Integer,Boolean>();/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mBtn=(Button) findViewById(R.id.select_btn); mBtn.setOnClickListener(this); mListView = (ListView) findViewById(R.id.list);mListView.setOnItemClickListener(this);InitData();mListViewAdapter = new ListViewAdapter(getLayoutInflater(),this,mData);mListView.setAdapter(mListViewAdapter); } private void InitData(){ mData.add("aaa"); mData.add("bbb"); mData.add("ccc"); mData.add("ddd"); mData.add("eee"); mData.add("fff"); mData.add("ggg"); }@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {// TODO Auto-generated method stubmListViewAdapter.setItemCheckBoxStatus(arg1, arg2);if(mCheckedObj.containsKey(arg2)){Log.w(TAG,"****onItemClick***NEED REMOVE***");mCheckedObj.remove(arg2);}else{Log.w(TAG,"****onItemClick***NEED put***");mCheckedObj.put(arg2, true);}if(mCheckedObj.size() == 0){Log.w(TAG,"****onItemClick**NO CHECKED***");mAllSelected = false;mBtn.setText("SelectAll");}else if(mCheckedObj.size() == mData.size()){mAllSelected = true;mBtn.setText("UnselectAll");}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.select_btn:{if(mAllSelected){mAllSelected = false;mBtn.setText("SelectAll");mListViewAdapter.setAllCheckBoxStatus(false);mCheckedObj.clear();}else{mAllSelected = true;mBtn.setText("UnselectAll");mListViewAdapter.setAllCheckBoxStatus(true);for(int i=0; i<mData.size();++i){mCheckedObj.put(i, true);}}//Refresh datamListViewAdapter.notifyDataSetChanged();}break;default:break;}}}
大功告成,因為代碼比較簡單,所以沒有加太多注釋。