/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.widget; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.view.LayoutInflater; import java.util.List; import java.util.Map; /** * 首个List对应子元素中所代表的组,第二个List对应孙子元素在子元素组中的位置. * Map亦将支持这样的特殊元素.(子元素嵌套组元素的情况) * 将XML文件中定义的静态数据映射到组及其视图的简单的适配器. * 你可以用 Map的列表,为组指定其后台数据.每个数组元素对应一个可展开列表的一个组. * Maps 包含每行的数据.你还可以指定 XML 文件来定义用于显示组的视图, * 并通过 Map 的键值映射到指定的视图.该过程适用于组的子元素. * 单级以外的可展开列表的后台数据类型为List<List<Map>>, * 第一级列表对应可扩展视图组中的组视图,第二级列表对应组的子组视图, * 最后 Map 保持子组视图的子视图的数据. */ public class SimpleExpandableListAdapter extends BaseExpandableListAdapter { private List<? extends Map<String, ?>> mGroupData; private int mExpandedGroupLayout; private int mCollapsedGroupLayout; private String[] mGroupFrom; private int[] mGroupTo; private List<? extends List<? extends Map<String, ?>>> mChildData; private int mChildLayout; private int mLastChildLayout; private String[] mChildFrom; private int[] mChildTo; private LayoutInflater mInflater; /** * 构造函数 * * @param context 运行时,与 {@link SimpleExpandableListAdapter} * 关联的 {@link ExpandableListView} 的上下文. * @param groupData 一个Maps列表.列表中的每个项目对应列表中的一个组. * Map 包含每个组的数据,应该包含“groupFrom”中所有项目. * @param groupFrom 用于从与组关联的每个 Map 中取得数据的键值列表. * @param groupTo 由“groupFrom”参数指定的用于显示的组视图.他们应该是文本视图. * 列表中的视图由“groupFrom”参数提供其显示的值. * @param groupLayout 定义组视图的视图布局资源标识.该布局文件应该至少包括 * groupTo中所定义的视图. * @param childData Map列表的列表.外层列表中的每个项目对应一个组(按组顺序排列). * 内层列表中的每个项目对应一个子组项目(按组顺序排列). * Map 对应子视图中的数据(按childFrom的顺序排列). * Map包含每个子视图的数据,应该包含在“childFrom”中指定的虽有条目. * @param childFrom 用于从与子视图关联的每个 Map 中取得数据的键值列表. * @param childTo 由“childFrom”参数指定的用于显示的子视图.他们应该是文本视图. * 列表中的视图由“childFrom”参数提供其显示的值. * @param childLayout 定义子视图的视图布局资源标识.该布局文件应该至少包括 * childTo中所定义的视图. */ public SimpleExpandableListAdapter(Context context, List<? extends Map<String, ?>> groupData, int groupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo) { this(context, groupData, groupLayout, groupLayout, groupFrom, groupTo, childData, childLayout, childLayout, childFrom, childTo); } /** * 构造函数 * * @param context 运行时,与 {@link SimpleExpandableListAdapter} * 关联的 {@link ExpandableListView} 的上下文. * @param groupData 一个Maps列表.列表中的每个项目对应列表中的一个组. * Map 包含每个组的数据,应该包含“groupFrom”中所有项目. * @param groupFrom 用于从与组关联的每个 Map 中取得数据的键值列表. * @param groupTo 由“groupFrom”参数指定的用于显示的组视图.他们应该是文本视图. * 列表中的视图由“groupFrom”参数提供其显示的值. * @param expandedGroupLayout 定义组展开时视图的XML资源布局. * 该布局文件应当至少包括所有在groupTo中所定义的视图. * @param collapsedGroupLayout 定义组收起时视图的XML资源布局. * 该布局文件应当至少包括所有在groupTo中所定义的视图. * @param childData Map列表的列表.外层列表中的每个项目对应一个组(按组顺序排列). * 内层列表中的每个项目对应一个子组项目(按组顺序排列). * Map 对应子视图中的数据(按childFrom的顺序排列). * Map包含每个子视图的数据,应该包含在“childFrom”中指定的虽有条目. * @param childFrom 用于从与子视图关联的每个 Map 中取得数据的键值列表. * @param childTo 由“childFrom”参数指定的用于显示的子视图.他们应该是文本视图. * 列表中的视图由“childFrom”参数提供其显示的值. * @param childLayout 定义子视图的视图布局资源标识.该布局文件应该至少包括 * childTo中所定义的视图. */ public SimpleExpandableListAdapter(Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo) { this(context, groupData, expandedGroupLayout, collapsedGroupLayout, groupFrom, groupTo, childData, childLayout, childLayout, childFrom, childTo); } /** * 构造函数 * * @param context 运行时,与 {@link SimpleExpandableListAdapter} * 关联的 {@link ExpandableListView} 的上下文. * @param groupData 一个Maps列表.列表中的每个项目对应列表中的一个组. * Map 包含每个组的数据,应该包含“groupFrom”中所有项目. * @param groupFrom 用于从与组关联的每个 Map 中取得数据的键值列表. * @param groupTo 由“groupFrom”参数指定的用于显示的组视图.他们应该是文本视图. * 列表中的视图由“groupFrom”参数提供其显示的值. * @param expandedGroupLayout 定义组展开时视图的XML资源布局. * 该布局文件应当至少包括所有在groupTo中所定义的视图. * @param collapsedGroupLayout 定义组收起时视图的XML资源布局. * 该布局文件应当至少包括所有在groupTo中所定义的视图. * @param childData Map列表的列表.外层列表中的每个项目对应一个组(按组顺序排列). * 内层列表中的每个项目对应一个子组项目(按组顺序排列). * Map 对应子视图中的数据(按childFrom的顺序排列). * Map包含每个子视图的数据,应该包含在“childFrom”中指定的虽有条目. * @param childFrom 用于从与子视图关联的每个 Map 中取得数据的键值列表. * @param childTo 由“childFrom”参数指定的用于显示的子视图.他们应该是文本视图. * 列表中的视图由“childFrom”参数提供其显示的值. * @param childLayout 定义子视图的视图布局资源标识 * (除了在使用了lastChildLayout时的最后一个子视图). * 该布局文件应该至少包括“childTo”中所定义的视图. * @param lastChildLayout 定义每个组中最后一个子视图的资源标识. * 布局文件至少应该包含在“childTo”中定义的视图. */ public SimpleExpandableListAdapter(Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, int lastChildLayout, String[] childFrom, int[] childTo) { mGroupData = groupData; mExpandedGroupLayout = expandedGroupLayout; mCollapsedGroupLayout = collapsedGroupLayout; mGroupFrom = groupFrom; mGroupTo = groupTo; mChildData = childData; mChildLayout = childLayout; mLastChildLayout = lastChildLayout; mChildFrom = childFrom; mChildTo = childTo; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public Object getChild(int groupPosition, int childPosition) { return mChildData.get(groupPosition).get(childPosition); } public long getChildId(int groupPosition, int childPosition) { return childPosition; } public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View v; if (convertView == null) { v = newChildView(isLastChild, parent); } else { v = convertView; } bindView(v, mChildData.get(groupPosition).get(childPosition), mChildFrom, mChildTo); return v; } /** * 为子项目实例化一个新视图. * @param isLastChild 该子视图是否是组中的最后一个视图. * @param parent 该新视图的父视图. * @return 新的子视图. */ public View newChildView(boolean isLastChild, ViewGroup parent) { return mInflater.inflate((isLastChild) ? mLastChildLayout : mChildLayout, parent, false); } private void bindView(View view, Map<String, ?> data, String[] from, int[] to) { int len = to.length; for (int i = 0; i < len; i++) { TextView v = (TextView)view.findViewById(to[i]); if (v != null) { v.setText((String)data.get(from[i])); } } } public int getChildrenCount(int groupPosition) { return mChildData.get(groupPosition).size(); } public Object getGroup(int groupPosition) { return mGroupData.get(groupPosition); } public int getGroupCount() { return mGroupData.size(); } public long getGroupId(int groupPosition) { return groupPosition; } public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View v; if (convertView == null) { v = newGroupView(isExpanded, parent); } else { v = convertView; } bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo); return v; } /** * 为组实例化新视图. * @param isExpanded 该视图当前是否处于展开状态. * @param parent 该新视图的父视图. * @return 新的组视图. */ public View newGroupView(boolean isExpanded, ViewGroup parent) { return mInflater.inflate((isExpanded) ? mExpandedGroupLayout : mCollapsedGroupLayout, parent, false); } public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public boolean hasStableIds() { return true; } }