Android ExpandableListView單選以及多選實現

一、概述

    ExpandableListView是常用的一個控件,今天自己做了個小練習,主要需求是單選以及多選的實現,看似比較簡單,但是還是比較複雜,把代碼貼給大家,有這種需求的可以參考一下。

二、效果截圖


三、實現過程

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <ExpandableListView
        android:id="@+id/exlistview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:listSelector="@android:color/transparent" >
    </ExpandableListView>

</LinearLayout>
group_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:padding="10dp" >

    <TextView
        android:id="@+id/id_group_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:padding="10dp"
        android:text="hao"
        android:textColor="@android:color/black"
        android:textIsSelectable="true"
        android:textSize="15sp" >
    </TextView>

    <CheckBox
        android:id="@+id/id_group_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

</RelativeLayout>
listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants"
    android:padding="10dp" >

    <TextView
        android:id="@+id/id_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:padding="10dp"
        android:layout_marginLeft="30dp"
        android:textColor="#55acac"
        android:textIsSelectable="true"
        android:textSize="15sp" >
    </TextView>

    <CheckBox
        android:id="@+id/id_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true" />

</RelativeLayout>
MainAcitivity.java

public class MainActivity extends Activity {
	private List<Map<String, String>> parentList = new ArrayList<Map<String, String>>();
	private List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
	private ExpandableListView exListView;
	private Context context = this;
	private MyAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		initData();
		setListener();
	}

	/**
	 * 記錄正在選中的子listview的item條目 用hashset是爲了去除重複值
	 */
	private HashSet<String> hashSet;

	private void setListener()
	{
		exListView.setOnGroupExpandListener(new OnGroupExpandListener()
		{
			
			@Override
			public void onGroupExpand(int groupPosition)
			{
				//存取已選定的集合
				hashSet = new HashSet<String>();
			}
		});
		// ExpandableListView的Group的點擊事件
		exListView.setOnGroupClickListener(new OnGroupClickListener()
		{

			@Override
			public boolean onGroupClick(ExpandableListView parent, View v,
					int groupPosition, long id)
			{
				// 可以寫點擊後實現的功能
				
				return false;
			}
		});
		// ExpandableListView的child的點擊事件

		exListView.setOnChildClickListener(new OnChildClickListener()
		{

			@Override
			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id)
			{
				Map<String, String> map = childData.get(groupPosition).get(
						childPosition);
				String childChecked = map.get("isChecked");
				if ("No".equals(childChecked))
				{
					map.put("isChecked", "Yes");
					hashSet.add("選定" + childPosition);
				} else
				{
					map.put("isChecked", "No");
					if (hashSet.contains("選定" + childPosition))
					{
						hashSet.remove("選定" + childPosition);
					}
				}
				System.out.println("選定的長度==1" + hashSet.size());
				System.out.println("選定的長度==2"
						+ childData.get(groupPosition).size());
				if (hashSet.size() == childData.get(groupPosition).size())
				{
					parentList.get(groupPosition).put("isGroupCheckd", "Yes");
				} else
				{
					parentList.get(groupPosition).put("isGroupCheckd", "No");
				}
				adapter.notifyDataSetChanged();
				return false;
			}
		});
	}

	// 初始化數據
	private void initData()
	{
		for (int i = 0; i < 10; i++)
		{
			Map<String, String> groupMap = new HashMap<String, String>();
			groupMap.put("groupText", "item" + i);
			groupMap.put("isGroupCheckd", "No");
			parentList.add(groupMap);
		}
		for (int i = 0; i < 10; i++)
		{
			List<Map<String, String>> list = new ArrayList<Map<String, String>>();
			for (int j = 0; j < 4; j++)
			{
				Map<String, String> map = new HashMap<String, String>();
				map.put("childItem", "childItem" + j);
				map.put("isChecked", "No");
				list.add(map);
			}
			childData.add(list);
		}
		adapter = new MyAdapter();
		exListView.setAdapter(adapter);
		exListView.expandGroup(0);
		hashSet = new HashSet<String>();
	}

	private void initView()
	{
		exListView = (ExpandableListView) findViewById(R.id.exlistview);
	}

	/**
	 * 適配adapter
	 */

	private class MyAdapter extends BaseExpandableListAdapter {
		@Override
		public Object getChild(int groupPosition, int childPosition)
		{
			// TODO Auto-generated method stub
			return childData.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)
		{

			ViewHolder holder = null;
			if (convertView == null)
			{
				holder = new ViewHolder();
				convertView = View.inflate(context, R.layout.listview_item,
						null);
				holder.childText = (TextView) convertView
						.findViewById(R.id.id_text);
				holder.childBox = (CheckBox) convertView
						.findViewById(R.id.id_checkbox);
				convertView.setTag(holder);
			} else
			{
				holder = (ViewHolder) convertView.getTag();
			}
			holder.childText.setText(childData.get(groupPosition)
					.get(childPosition).get("childItem"));
			String isChecked = childData.get(groupPosition).get(childPosition)
					.get("isChecked");
			if ("No".equals(isChecked))
			{
				holder.childBox.setChecked(false);
			} else
			{
				holder.childBox.setChecked(true);
			}
			return convertView;
		}

		@Override
		public int getChildrenCount(int groupPosition)
		{
			// TODO Auto-generated method stub
			return childData.get(groupPosition).size();
		}

		@Override
		public Object getGroup(int groupPosition)
		{
			return parentList.get(groupPosition);
		}

		@Override
		public int getGroupCount()
		{
			// TODO Auto-generated method stub
			return parentList.size();
		}

		@Override
		public long getGroupId(int groupPosition)
		{
			// TODO Auto-generated method stub
			return groupPosition;
		}

		@Override
		public View getGroupView(final int groupPosition,
				final boolean isExpanded, View convertView, ViewGroup parent)
		{
			ViewHolder holder = null;
			if (convertView == null)
			{
				holder = new ViewHolder();
				convertView = View.inflate(context, R.layout.group_item, null);
				holder.groupText = (TextView) convertView
						.findViewById(R.id.id_group_text);
				holder.groupBox = (CheckBox) convertView
						.findViewById(R.id.id_group_checkbox);
				convertView.setTag(holder);
			} else
			{
				holder = (ViewHolder) convertView.getTag();
			}
			holder.groupText.setText(parentList.get(groupPosition).get(
					"groupText"));
			final String isGroupCheckd = parentList.get(groupPosition).get(
					"isGroupCheckd");

			if ("No".equals(isGroupCheckd))
			{
				holder.groupBox.setChecked(false);
			} else
			{
				holder.groupBox.setChecked(true);
			}
		
			/*
			 * groupListView的點擊事件
			 */
			holder.groupBox.setOnClickListener(new OnClickListener()
			{

				@Override
				public void onClick(View v)
				{
					CheckBox groupBox = (CheckBox) v
							.findViewById(R.id.id_group_checkbox);
					if (!isExpanded)
					{
						//展開某個group view
						exListView.expandGroup(groupPosition);
					} else
					{
						//關閉某個group view
						exListView.collapseGroup(groupPosition);
					}

					if ("No".equals(isGroupCheckd))
					{
						exListView.expandGroup(groupPosition);
						groupBox.setChecked(true);
						parentList.get(groupPosition).put("isGroupCheckd",
								"Yes");
						List<Map<String, String>> list = childData
								.get(groupPosition);
						for (Map<String, String> map : list)
						{
							map.put("isChecked", "Yes");
						}
					} else
					{
						groupBox.setChecked(false);
						parentList.get(groupPosition)
								.put("isGroupCheckd", "No");
						List<Map<String, String>> list = childData
								.get(groupPosition);
						for (Map<String, String> map : list)
						{
							map.put("isChecked", "No");
						}
					}
					notifyDataSetChanged();
				}
			});
			return convertView;
		}

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

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

	}

	private class ViewHolder {
		TextView groupText, childText;
		CheckBox groupBox, childBox;
	}
}

四、總結及注意點

1、設置CheckBox的點擊事件,而非別的

2、exListView.collapseGroup(groupPosition); 關閉正展開的子ListView.

這是demo地址,歡迎下載:

Demo下載地址


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