ExpandableListView的基本使用

项目地址: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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38859786/article/details/80423203