项目地址:https://gitee.com/XiaoBiXianSheng/ExpandableListView项目地址
一,在Activity中让子条目全部展开
//Group左边会默认有以上下切换的图标,假如你有强迫症可以通过mListView.setGroupIndicator(null)去除。 mExpandableListView = (ExpandableListView) findViewById(R.id.exp_listview); mExpandableListView.setAdapter(new ExpandableAdapter(Constant.BOOKS, Constant.FIGURES)); mExpandableListView.setChildIndicator(null); //让子条目全部展开
for (int i = 0; i < groupList.size(); i++) { mExpandableListView.expandGroup(i); }
1.1,要想让点击父条目时,子条目全部展开,不受父条目点击的影响,为了不让他折叠,监听父类必须返回true
// 设置分组项的点击监听事件 mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { Toast.makeText(getApplicationContext(), Constant.BOOKS[groupPosition], Toast.LENGTH_SHORT).show(); // 请务必返回 false,否则分组不会展开 //展开子条目时,没有设置点击事件,此时点击父条目,子条目会折叠,为了不让他折叠,就得返回true return true; } });
二,在适配器中实现10个方法
public class ExpandableAdapter extends BaseExpandableListAdapter { private final String[] group_list; private final String[][] child_list; private final SparseArray<ImageView> mIndicators; private OnGroupExpandedListener mOnGroupExpandedListener; //private final ArrayList<ChildBean> child_list; //private final ArrayList<GroupBean> group_list; public ExpandableAdapter(String[] group_list, String[][] child_list) { this.group_list = group_list; this.child_list = child_list; mIndicators = new SparseArray<>(); } //获取分组的个数 @Override public int getGroupCount() { if (group_list.length != 0) { return group_list.length; } return 0; } //获取分组的个数 @Override public int getChildrenCount(int groupPosition) { if (child_list.length != 0) { return child_list.length; } return 0; } //获取指定的分组数据 @Override public Object getGroup(int groupPosition) { return group_list[groupPosition]; } //获取指定分组中的指定子选项数据 @Override public Object getChild(int groupPosition, int childPosition) { return child_list[groupPosition][childPosition]; } //获取指定分组的ID, 这个ID必须是唯一的 @Override public long getGroupId(int groupPosition) { return groupPosition; } //获取子选项的ID, 这个ID必须是唯一的 @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们。 //系统会跟据id来确定当前显示哪条内容,也就是firstVisibleChild的位置 @Override public boolean hasStableIds() { return true;//默认是false } //获取显示指定分组的视图 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder groupViewHolder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_expand_group, parent, false); groupViewHolder = new GroupViewHolder(); groupViewHolder.groupName = (TextView) convertView.findViewById(R.id.group_name); groupViewHolder.group_iv = (ImageView) convertView.findViewById(R.id.group_iv); convertView.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) convertView.getTag(); } if (groupPosition < group_list.length) groupViewHolder.groupName.setText(group_list[groupPosition]); //只展示一组条目的设置 //把位置和图标添加到Map // mIndicators.put(groupPosition, groupViewHolder.group_iv); // //根据分组状态设置Indicator // setIndicatorState(groupPosition, isExpanded); return convertView; } //获取显示指定分组中的指定子选项的视图 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder childViewHolder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_expand_child, parent, false); childViewHolder = new ChildViewHolder(); childViewHolder.childName = (TextView) convertView.findViewById(R.id.child_name); convertView.setTag(childViewHolder); } else { childViewHolder = (ChildViewHolder) convertView.getTag(); } if(groupPosition < group_list.length && childPosition< child_list.length) {//防止索引越界 childViewHolder.childName.setText(child_list[groupPosition][childPosition]); } return convertView; } //指定位置上的子元素是否可选中 //当不加任何条件直接返回false,所有的组的child均不可点击。 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } static class GroupViewHolder { TextView groupName; ImageView group_iv; } static class ChildViewHolder { TextView childName; } }
三,只展示一组列表,父条目的箭头要发生变化
3.1,在activity中
public class ThirdAcivity extends AppCompatActivity { private SwipeRefreshLayout refreshLayout; private ExpandableListView mExpandableListView; private ExpandableAdapter mAdapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); initUI(); intiListener(); } private void initUI() { //support library的版本升级到19.1或更新,才能使用 refreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh); //设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,可以设置多种不同的颜色,每转一圈就显示一种颜色 refreshLayout.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark); //设置下拉进度条的背景颜色,默认白色。 //refreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.holo_red_dark); //Group左边会默认有以上下切换的图标,假如你有强迫症可以通过mListView.setGroupIndicator(null)去除。 mExpandableListView = (ExpandableListView) findViewById(R.id.exp_listview); mAdapter = new ExpandableAdapter(Constant.BOOKS, Constant.FIGURES); mExpandableListView.setAdapter(mAdapter); mAdapter.setOnGroupExpandedListener(new OnGroupExpandedListener() { @Override public void onGroupExpanded(int groupPosition) { expandOnlyOne(groupPosition); } }); } private void intiListener() { refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable() { @Override public void run() { Toast.makeText(ThirdAcivity.this, "刷新了一条数据", Toast.LENGTH_SHORT).show(); // 加载完数据设置为不刷新状态,将下拉进度收起来 refreshLayout.setRefreshing(false); } }, 1000); } }); //由于谷歌并没有提供上拉加载更多的布局,所以我们只能自己去定义布局实现这个功能。 // 设置分组项的点击监听事件 mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { boolean groupExpanded = parent.isGroupExpanded(groupPosition); mAdapter.setIndicatorState(groupPosition, groupExpanded); Toast.makeText(getApplicationContext(), Constant.BOOKS[groupPosition], Toast.LENGTH_SHORT).show(); // 请务必返回 false,否则分组不会展开 //展开子条目时,没有设置点击事件,此时点击父条目,子条目会折叠,为了不让他折叠,就得返回true return false; } }); // 设置子选项点击监听事件 mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Log.e("date", "点击了子条目: " ); Toast.makeText(getApplicationContext(), Constant.FIGURES[groupPosition][childPosition], Toast.LENGTH_SHORT).show(); return true; } }); } // 每次展开一个分组后,关闭其他的分组 private boolean expandOnlyOne(int expandedPosition) { boolean result = true; int groupLength = mExpandableListView.getExpandableListAdapter().getGroupCount(); for (int i = 0; i < groupLength; i++) { if (i != expandedPosition && mExpandableListView.isGroupExpanded(i)) { result &= mExpandableListView.collapseGroup(i); } } return result; }
3.2,在适配器中,监听父条目的打开折叠
public class ExpandableAdapter extends BaseExpandableListAdapter { private final String[] group_list; private final String[][] child_list; private final SparseArray<ImageView> mIndicators; private OnGroupExpandedListener mOnGroupExpandedListener; //private final ArrayList<ChildBean> child_list; //private final ArrayList<GroupBean> group_list; public ExpandableAdapter(String[] group_list, String[][] child_list) { this.group_list = group_list; this.child_list = child_list; mIndicators = new SparseArray<>(); } //根据分组的展开闭合状态设置指示器 public void setIndicatorState(int groupPosition, boolean isExpanded) { if (isExpanded) { mIndicators.get(groupPosition).setImageResource(R.drawable.ic_expand_less); } else { mIndicators.get(groupPosition).setImageResource(R.drawable.ic_expand_more); } } /*为了只展示一组条目*/ public void setOnGroupExpandedListener(OnGroupExpandedListener onGroupExpandedListener) { mOnGroupExpandedListener = onGroupExpandedListener; } //监听父条目的打开折叠 @Override public void onGroupExpanded(int groupPosition) { if (mOnGroupExpandedListener != null) { mOnGroupExpandedListener.onGroupExpanded(groupPosition); } } //获取分组的个数 @Override public int getGroupCount() { if (group_list.length != 0) { return group_list.length; } return 0; } //获取分组的个数 @Override public int getChildrenCount(int groupPosition) { if (child_list.length != 0) { return child_list.length; } return 0; } //获取指定的分组数据 @Override public Object getGroup(int groupPosition) { return group_list[groupPosition]; } //获取指定分组中的指定子选项数据 @Override public Object getChild(int groupPosition, int childPosition) { return child_list[groupPosition][childPosition]; } //获取指定分组的ID, 这个ID必须是唯一的 @Override public long getGroupId(int groupPosition) { return groupPosition; } //获取子选项的ID, 这个ID必须是唯一的 @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们。 //系统会跟据id来确定当前显示哪条内容,也就是firstVisibleChild的位置 @Override public boolean hasStableIds() { return true;//默认是false } //获取显示指定分组的视图 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder groupViewHolder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_expand_group, parent, false); groupViewHolder = new GroupViewHolder(); groupViewHolder.groupName = (TextView) convertView.findViewById(R.id.group_name); groupViewHolder.group_iv = (ImageView) convertView.findViewById(R.id.group_iv); convertView.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) convertView.getTag(); } if (groupPosition < group_list.length) groupViewHolder.groupName.setText(group_list[groupPosition]); //只展示一组条目的设置 //把位置和图标添加到Map mIndicators.put(groupPosition, groupViewHolder.group_iv); // //根据分组状态设置Indicator setIndicatorState(groupPosition, isExpanded); return convertView; } //获取显示指定分组中的指定子选项的视图 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder childViewHolder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_expand_child, parent, false); childViewHolder = new ChildViewHolder(); childViewHolder.childName = (TextView) convertView.findViewById(R.id.child_name); convertView.setTag(childViewHolder); } else { childViewHolder = (ChildViewHolder) convertView.getTag(); } if(groupPosition < group_list.length && childPosition< child_list.length) {//防止索引越界 childViewHolder.childName.setText(child_list[groupPosition][childPosition]); } return convertView; } //指定位置上的子元素是否可选中 //当不加任何条件直接返回false,所有的组的child均不可点击。 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return false; } static class GroupViewHolder { TextView groupName; ImageView group_iv; } static class ChildViewHolder { TextView childName; } }