上篇文章讲了自定义带CheckBox的LISTVIEW的实现,这篇来讲讲自定义带CheckBox的ExpandableListView实现,原理思想跟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"可以去掉默认的分割线 这两个设置了后就可以换成自己的背景了。 --> <ExpandableListView android:id="@+id/expandableListView" android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" /> </LinearLayout>
<?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/group_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dip" android:textSize="16dip" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/icon" android:layout_width="30dp" android:layout_height="27dp" android:layout_marginRight="5dip" android:layout_alignParentRight="true" android:gravity="center_vertical" /> </RelativeLayout> </LinearLayout>
然后还需要一个CHILD的布局文件,我是由一个TextView和一个CheckBox组成的。如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>
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.BaseExpandableListAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; public class ExpandableListViewAdapter extends BaseExpandableListAdapter { private List<String> mGroupData = new ArrayList<String>(); private List<HashMap<Integer,String>> mChildData= new ArrayList<HashMap<Integer,String>>(); // private Context mContext; LayoutInflater mInflater; // 用来控制CheckBox的选中状况 private List<HashMap<Integer,Boolean>> isSelected; public ExpandableListViewAdapter(LayoutInflater inflater,Context mcontext,List<String> mGroup,List<HashMap<Integer,String>> mChild) { mInflater = inflater; // mContext = mcontext; isSelected = new ArrayList<HashMap<Integer,Boolean>>(); mGroupData = mGroup; mChildData = mChild; initSelectedMap(); } public void initSelectedMap(){ //默认全部未勾选状态。 for(int groupId = 0; groupId < mGroupData.size();++groupId){ HashMap<Integer,Boolean> mChildCheck = new HashMap<Integer,Boolean>(); for(int childId = 0; childId< mChildData.get(groupId).size();++childId){ mChildCheck.put(childId, false); } isSelected.add(mChildCheck); } } public void setListViewData(List<String> mGroup,List<HashMap<Integer,String>> mChild){ mGroupData = mGroup; mChildData = mChild; } public void setItemCheckBoxStatus(View mView,int groupPosition,int childPostion){ ViewTag holder = (ViewTag) mView.getTag(); // 改变CheckBox的状态 holder.mCheckBox.toggle(); // 将CheckBox的选中状况记录下来 isSelected.get(groupPosition).put(childPostion, holder.mCheckBox.isChecked()); } public void setAllCheckBoxStatus(Boolean mFlag){ for(int groupId = 0; groupId < mGroupData.size();++groupId){ for(int childId = 0; childId< mChildData.get(groupId).size();++childId){ isSelected.get(groupId).put(childId, mFlag); } } } public class ViewTag{ public TextView mTextView; public CheckBox mCheckBox; public ImageView mIcon; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return mChildData.get(groupPosition).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewTag mVobj = new ViewTag(); View v; if(convertView != null){ v = convertView; } else{ v = mInflater.inflate(R.layout.listview_item, null); } mVobj.mTextView = (TextView) v.findViewById(R.id.name); mVobj.mCheckBox = (CheckBox) v.findViewById(R.id.listcb); mVobj.mCheckBox.setChecked(isSelected.get(groupPosition).get(childPosition)); mVobj.mTextView.setText(mChildData.get(groupPosition).get(childPosition)); v.setTag(mVobj); return v; } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return mChildData.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return mGroupData.get(groupPosition); } @Override public int getGroupCount() { // TODO Auto-generated method stub return mGroupData.size(); } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewTag mVobj = new ViewTag(); View v; if(convertView != null){ v = convertView; } else{ v = mInflater.inflate(R.layout.listview_group_item, null); } mVobj.mTextView = (TextView) v.findViewById(R.id.group_name); mVobj.mTextView.setText(mGroupData.get(groupPosition)); mVobj.mIcon = (ImageView) v.findViewById(R.id.icon); v.setTag(mVobj); if (isExpanded) { mVobj.mIcon.setImageResource(R.drawable.expandlist_up); } else { mVobj.mIcon.setImageResource(R.drawable.expandlist_down); } return v; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } }
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.Button; import android.widget.ExpandableListView; import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ExpandableListView.OnGroupClickListener; public class ExpandableListViewCheckbox extends Activity implements OnClickListener{ private static final String TAG="ExpandableListViewCheckboxActivity"; private Button mBtn; private ExpandableListView mListView; private ExpandableListViewAdapter mListViewAdapter = null; private List<String> mGroupData = new ArrayList<String>(); private List<HashMap<Integer,String>> mChildData= new ArrayList<HashMap<Integer,String>>(); //control select button status(SelectedAll or UnselectAll) private Boolean mAllSelected = false; private List<HashMap<Integer,Boolean>> mCheckedObj = new ArrayList<HashMap<Integer,Boolean>>(); private int mAllSelectedSize = 0; /** 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 = (ExpandableListView) findViewById(R.id.expandableListView); mListView.setGroupIndicator(null); InitData(); mListView.setOnGroupClickListener(new OnGroupClickListener(){ @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { // TODO Auto-generated method stub return false; } }); mListView.setOnChildClickListener(new OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // TODO Auto-generated method stub //Log.w(TAG,"********onChildClick*********"); mListViewAdapter.setItemCheckBoxStatus(v, groupPosition,childPosition); if(mCheckedObj.get(groupPosition).containsKey(childPosition)){ // Log.w(TAG,"****onItemClick***NEED REMOVE***"); mCheckedObj.get(groupPosition).remove(childPosition); } else{ // Log.w(TAG,"****onItemClick***NEED put***"); mCheckedObj.get(groupPosition).put(childPosition, true); } if(getCheckedObjSize() == 0){ // Log.w(TAG,"****onItemClick**NO CHECKED***"); mAllSelected = false; mBtn.setText("SelectAll"); } else if(getCheckedObjSize() == mAllSelectedSize){ mAllSelected = true; mBtn.setText("UnselectAll"); } return false; } }); mListViewAdapter = new ExpandableListViewAdapter(getLayoutInflater(),this,mGroupData,mChildData); mListView.setAdapter(mListViewAdapter); } private HashMap<Integer,String> setHashMap(int size,String mstring){ HashMap<Integer,String> temp = new HashMap<Integer,String>(); for(int i=0;i< size; ++i){ temp.put(i, mstring+i); } return temp; } private void InitData(){ mGroupData.add("aaa"); mChildData.add(setHashMap(2,"a")); mGroupData.add("bbb"); mChildData.add(setHashMap(4,"b")); mGroupData.add("ccc"); mChildData.add(setHashMap(3,"c")); mGroupData.add("ddd"); mChildData.add(setHashMap(1,"d")); mGroupData.add("eee"); mChildData.add(setHashMap(2,"e")); mGroupData.add("fff"); mChildData.add(setHashMap(5,"f")); mGroupData.add("ggg"); mChildData.add(setHashMap(1,"g")); for(int groupId = 0; groupId < mGroupData.size();++groupId){ HashMap<Integer,Boolean> temp = new HashMap<Integer,Boolean>(); for(int childId = 0; childId < mChildData.get(groupId).size();++childId){ mAllSelectedSize++; } mCheckedObj.add(temp); } } private int getCheckedObjSize(){ int size =0; for(int groupId = 0; groupId < mGroupData.size();++groupId){ size += mCheckedObj.get(groupId).size(); } return size; } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.select_btn:{ if(mAllSelected){ mAllSelected = false; mBtn.setText("SelectAll"); mListViewAdapter.setAllCheckBoxStatus(false); for(int groupId = 0; groupId < mGroupData.size();++groupId){ mCheckedObj.get(groupId).clear(); } } else{ mAllSelected = true; mBtn.setText("UnselectAll"); mListViewAdapter.setAllCheckBoxStatus(true); for(int groupId = 0; groupId < mGroupData.size();++groupId){ for(int childId = 0; childId < mChildData.get(groupId).size();++childId){ mCheckedObj.get(groupId).put(childId, true); } } } //Refresh data mListViewAdapter.notifyDataSetChanged(); } break; default:break; } } }