带全选的ExpandableListView

相信大家都不陌生,每天都会看到好多次,别给我说你不用QQ,微信,那么问题来了,如何在ExpandableListView加上全选按钮呢?废话不多说,直接上代码:


一:MainActivity:

package visahall.cn.expandablelistcheckbox;

import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ExpandableListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

	private ExpandableListView expandableList;
	private Button showBtn;
	private ListViewAdapter adapter;
	private List<GroupItem> dataList = new ArrayList<GroupItem>();
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		expandableList = (ExpandableListView)findViewById(R.id.expandable_list);
		showBtn = (Button)findViewById(R.id.showBtn);
		
		showBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				showCheckedItems();
			}
		});
		
		initData();
		
		
		adapter = new ListViewAdapter(this, dataList);
		expandableList.setAdapter(adapter);
		
	}

	private void showCheckedItems(){
		String checkedItems = "";
		List<String> checkedChildren = adapter.getCheckedChildren();
		if (checkedChildren!=null && !checkedChildren.isEmpty()) {
			for (String child : checkedChildren) {
				if (checkedItems.length()>0) {
					checkedItems += "\n";
				}
				
				checkedItems += child;
			}
		}
		
		final Builder builder = new Builder(this);
		builder.setTitle("已选中项(无排序):");
		builder.setMessage(checkedItems);
		builder.setPositiveButton("关闭", null);
		builder.setCancelable(true);
		builder.create().show();
	}
	
	
	private void initData(){
		List<ChildrenItem> list1 = new ArrayList<ChildrenItem>();
		list1.add(new ChildrenItem("childrenItem1","childrenItem1"));
		list1.add(new ChildrenItem("childrenItem2","childrenItem2"));
		list1.add(new ChildrenItem("childrenItem3","childrenItem3"));
		
		GroupItem groupItem1 = new GroupItem("groupItem1","groupItem1",list1);
		dataList.add(groupItem1);
		
		List<ChildrenItem> list2 = new ArrayList<ChildrenItem>();
		list2.add(new ChildrenItem("childrenItem4","childrenItem4"));
		list2.add(new ChildrenItem("childrenItem5","childrenItem5"));
		
		GroupItem groupItem2 = new GroupItem("groupItem2","groupItem2",list2);
		dataList.add(groupItem2);
		
		List<ChildrenItem> list3 = new ArrayList<ChildrenItem>();
		list3.add(new ChildrenItem("childrenItem6","childrenItem6"));
		list3.add(new ChildrenItem("childrenItem7","childrenItem7"));
		list3.add(new ChildrenItem("childrenItem8","childrenItem8"));
		
		GroupItem groupItem3 = new GroupItem("groupItem3","groupItem3",list3);
		dataList.add(groupItem3);
		
	}
	
}

二:需要2个实体类:


import java.util.List;

public class GroupItem {

	private String id;
	private String name;
	private List<ChildrenItem> childrenItems;
	
	
	public GroupItem() {
	}

	
	public GroupItem(String id,String name,List<ChildrenItem> childrenItems) {
		this.id = id;
		this.name = name;
		this.childrenItems = childrenItems;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}


	public List<ChildrenItem> getChildrenItems() {
		return childrenItems;
	}


	public void setChildrenItems(List<ChildrenItem> childrenItems) {
		this.childrenItems = childrenItems;
	}

	
	
	
}
public class ChildrenItem {

	private String id;
	private String name;
	
	public ChildrenItem() {
	}

	
	public ChildrenItem(String id,String name) {
		this.id = id;
		this.name = name;
	}
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	
	
}

三:最后当然就是Adapter了:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class ListViewAdapter extends BaseExpandableListAdapter {
	private List<GroupItem> dataList;
	private LayoutInflater inflater;
	//已选择的子列表项
	private List<String> checkedChildren = new ArrayList<String>();
	//父列表的选中状态  value  ----- 1(全选中)  2(部分选中)  3(未选中)
	private Map<String, Integer> groupCheckedStateMap = new HashMap<String, Integer>();  
	
	public ListViewAdapter(Context context, List<GroupItem> dataList) {
		this.dataList = dataList;
		inflater = LayoutInflater.from(context);
		
		//刚进来就全选中̬
//		int groupCount = getGroupCount();
//		for (int groupPosition = 0; groupPosition < groupCount; groupPosition++) {
//			try {
//				GroupItem groupItem = dataList.get(groupPosition);
//				if (groupItem==null || groupItem.getChildrenItems() == null
//						|| groupItem.getChildrenItems().isEmpty()) {
//					groupCheckedStateMap.put(groupItem.getId(), 3);
//					continue;
//				}
//
//				groupCheckedStateMap.put(groupItem.getId(), 1);
//				List<ChildrenItem> childrenItems = groupItem.getChildrenItems();
//				for (ChildrenItem childrenItem : childrenItems) {
//					checkedChildren.add(childrenItem.getId());
//				}
//
//			} catch (Exception e) {
//
//			}
//		}
	}
	
	
	@Override
	public Object getChild(int groupPosition, int childPosition) {
		final GroupItem groupItem = dataList.get(groupPosition);
		if (groupItem==null || groupItem.getChildrenItems()==null
				|| groupItem.getChildrenItems().isEmpty()) {
			return null;
		}
		return groupItem.getChildrenItems().get(childPosition);
	}


	@Override
	public long getChildId(int groupPosition, int childPosition) {
		return childPosition;
	}


	@Override
	public View getChildView(final int groupPosition, int childPosition,
			boolean isLastChild, View convertView, final ViewGroup parent) {
		ChildrenItem childrenItem = (ChildrenItem) getChild(groupPosition, childPosition);
		
		ChildViewHolder viewHolder = null;
		if (convertView == null) {
			viewHolder = new ChildViewHolder();
			convertView = inflater.inflate(R.layout.children_item, null);
			viewHolder.childrenNameTV = (TextView) convertView.findViewById(R.id.children_name);
			viewHolder.childrenCB = (CheckBox) convertView.findViewById(R.id.children_cb);
			
			convertView.setTag(viewHolder);
		} else {
			viewHolder = (ChildViewHolder) convertView.getTag();
		}
		
		viewHolder.childrenNameTV.setText(childrenItem.getName());
		final String childrenId = childrenItem.getId();
		
		viewHolder.childrenCB.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					if (!checkedChildren.contains(childrenId)) {
						checkedChildren.add(childrenId);
					}
				}else {
					checkedChildren.remove(childrenId);
				}
				
				setGroupItemCheckedState(dataList.get(groupPosition));
				
				ListViewAdapter.this.notifyDataSetChanged();
			}
		});
		
		
		if (checkedChildren.contains(childrenId)) {
			viewHolder.childrenCB.setChecked(true);
		}else {
			viewHolder.childrenCB.setChecked(false);
		}
		
		return convertView;
	}


	@Override
	public int getChildrenCount(int groupPosition) {
		final GroupItem groupItem = dataList.get(groupPosition);
		if (groupItem== null || groupItem.getChildrenItems()==null
				|| groupItem.getChildrenItems().isEmpty()) {
			return 0;
		}
		return groupItem.getChildrenItems().size();
	}


	@Override
	public Object getGroup(int groupPosition) {
		if (dataList==null) {
			return null;
		}
		return dataList.get(groupPosition);
	}


	@Override
	public int getGroupCount() {
		if (dataList==null) {
			return 0;
		}
		return dataList.size();
	}


	@Override
	public long getGroupId(int groupPosition) {
		return groupPosition;
	}


	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		try {
			GroupItem groupItem = dataList.get(groupPosition);
			
			GroupViewHolder viewHolder = null;
			if (convertView == null) {
				viewHolder = new GroupViewHolder();
				convertView = inflater.inflate(R.layout.group_item, null);
				viewHolder.groupNameTV = (TextView) convertView.findViewById(R.id.group_name);
				viewHolder.groupCBImg = (TextView) convertView.findViewById(R.id.group_cb_img);
				viewHolder.groupCBLayout = (LinearLayout) convertView.findViewById(R.id.cb_layout);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (GroupViewHolder) convertView.getTag();
			}
		   
			viewHolder.groupCBLayout.setOnClickListener(new GroupCBLayoutOnClickListener(groupItem));
			viewHolder.groupNameTV.setText(groupItem.getName());
			int state = groupCheckedStateMap.get(groupItem.getId());
			switch (state) {
			case 1:
				//viewHolder.groupCBImg.setImageResource(R.mipmap.ck_checked);
				break;
			case 2:
				//viewHolder.groupCBImg.setImageResource(R.mipmap.ck_partial_checked);
				break;
			case 3:
				//viewHolder.groupCBImg.setImageResource(R.mipmap.ck_unchecked);
				break;
			default:
				break;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return convertView;
	}


	@Override
	public boolean hasStableIds() {
		return false;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		return false;
	}
	


	private void setGroupItemCheckedState(GroupItem groupItem){
		List<ChildrenItem> childrenItems = groupItem.getChildrenItems();
		if (childrenItems==null || childrenItems.isEmpty()) {
			groupCheckedStateMap.put(groupItem.getId(), 3);
			return;
		}
		
		int  checkedCount = 0;
		for (ChildrenItem childrenItem : childrenItems) {
			if (checkedChildren.contains(childrenItem.getId())) {
				checkedCount ++;
			}
		}
		int state = 1;
		if (checkedCount==0) {
			state = 3;
		}else if (checkedCount==childrenItems.size()) {
			state = 1;
		}else {
			state = 2;
		}
		
		groupCheckedStateMap.put(groupItem.getId(), state);
	}
	
	

	final static class GroupViewHolder {
		TextView groupNameTV;
		TextView groupCBImg;
		LinearLayout groupCBLayout;
	}
	
	final static class ChildViewHolder {
		TextView childrenNameTV;
		CheckBox childrenCB;
	}
	
	 
	public class GroupCBLayoutOnClickListener implements OnClickListener{

		private GroupItem groupItem;
		
		public GroupCBLayoutOnClickListener(GroupItem groupItem){
			this.groupItem = groupItem;
		}
		
		@Override
		public void onClick(View v) {
			List<ChildrenItem> childrenItems = groupItem.getChildrenItems();
			if (childrenItems==null || childrenItems.isEmpty()) {
				groupCheckedStateMap.put(groupItem.getId(), 3);
				return;
			}
			int  checkedCount = 0;
			for (ChildrenItem childrenItem : childrenItems) {
				if (checkedChildren.contains(childrenItem.getId())) {
					checkedCount ++;
				}
			}
			
			boolean checked = false;
			if (checkedCount==childrenItems.size()) {
				checked = false;
				groupCheckedStateMap.put(groupItem.getId(), 3);
			}else{
				checked = true;
				groupCheckedStateMap.put(groupItem.getId(), 1);
			}
			
			for (ChildrenItem childrenItem : childrenItems) {
				String holderKey = childrenItem.getId();
				if (checked) {
					if (!checkedChildren.contains(holderKey)) {
						checkedChildren.add(holderKey);
					}
				}else {
					checkedChildren.remove(holderKey);
				}
			}
			
			ListViewAdapter.this.notifyDataSetChanged();
		}
	}


	public List<String> getCheckedRecords() {
		return checkedChildren;
	}


	public List<String> getCheckedChildren() {
		return checkedChildren;
	}
	
	
}

至此就全部完成了,是不是很简洁,哈哈。。


Demo下载


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值