zoukankan      html  css  js  c++  java
  • Android 开发学习进程0.31 二级列表 ExpandableListView使用相关

    二级列表ExpandableListView

    Android二级列表有许多实现方式,如两个recyclerview嵌套,如想要简单实用子列表展开收缩的功能使用expandablelistview较为简单。

    1. activity中的初始化expandablelistview
      expandAdapter = new ActLinExamExpandAdapter(this, mlList);
            expandListView.setAdapter(expandAdapter);
            expandListView.setDivider(null);
            expandListView.setGroupIndicator(null);
    

    adapter继承了baseExpandableListView ,其中的内容下面再讲,setDivider方法是设置分割线,设计途中不需要就可以直接设置为空,或者可以在布局文件中使用android:divider="@null" setGroupIndicator方法设置指示器,也就是展开子列表的标志,默认是一个小三角,也可以直接设置为空,同时布局文件设置了 android:scrollbars="none" 设置滚动条为空。在数据变化后使用 expandAdapter.notifyDataSetChanged();更改列表数据。
    2. adapter的使用方法
    这里只贴出一些主要代码和简单使用需要重写的方法,初始化方法是传context和需要的数据。
    getGroupCont方法是父列表的长度,需要传外层数据数量,同理getChildrenCount方法返回父列表中的子列表数量。
    下面是重点需要重写的方法,首先自定义viewholder类,构造方法是父布局和子布局的convertView,在其中添加定义布局中的组件,分别在getGroupView 和getChildView中初始化,注意这两个方法是会多次使用,同时convertview也可能会被复用。可以在此再定义recyclerview实现三级列表效果。同时需要修改isChildSelectable方法返回值为true,否则子项点击事件会不起作用。

      @Override
        public int getGroupCount() {
            return beanList == null ? 0 : beanList.size();
        }
        @Override
        public int getChildrenCount(int groupPosition) {
            return beanList.get(groupPosition).getShuju() == null ? 0 :
                    beanList.get(groupPosition).getShuju().size();
        }
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            ViewHoldParent viewHoldParent;
            if (convertView == null) {
                convertView = View.inflate(parent.getContext(),R.layout.item_actlinexam_expandlist, null);
                viewHoldParent = new ViewHoldParent(convertView);
                convertView.setTag(viewHoldParent);
            } else {
                viewHoldParent = (ViewHoldParent) convertView.getTag();
            }
            viewHoldParent.tvMonth.setText(String.valueOf(beanList.get(groupPosition).getM()));
            return convertView;
        }
     @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            ViewHoldChildren viewHoldChildren;
            if (convertView == null) {
                convertView = View.inflate(parent.getContext(),R.layout.item_actlinexam_expandchild, null);
                viewHoldChildren = new ViewHoldChildren(convertView);
                convertView.setTag(viewHoldChildren);
            } else {
                viewHoldChildren = (ViewHoldChildren) convertView.getTag();
            }
            return convertView;
        }
     @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }
        public static class ViewHoldParent {
            private final TextView tvMonth, tvYear;
            public ViewHoldParent(View itemView) {
                tvYear = itemView.findViewById(R.id.tv_item_actlinexam_expand_year);
            }
        }
        public static class ViewHoldChildren {
            private final TextView tvTitle, tvLaber;
            public ViewHoldChildren(View itemView) {
                tvTitle = itemView.findViewById(R.id.tv_actlinexam_expandchild_title);
            }
        }
    
    1. 其他问题
      自定义控件监听事件点击展开收缩方法有
                if (expandListView.isGroupExpanded(position)) {
                        expandListView.collapseGroup(position);
                    } else {
                        expandListView.expandGroup(position);
                    }
    

    子项点击问题,子项的某一控件可能会与父布局争夺焦点使得点击失效 ,此时可以使用 android:descendantFocusability="blocksDescendants"方法在子布局的根布局下。
    android:descendantFocusability属性如下:
    beforeDescendants:viewgroup会优先其子类控件而获取到焦点
    afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
    blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
    如果在此需要同时设置子项点击和子项其中的一个控件如imageview的点击,这里建议重写imageview的点击事件,并在adapter中写接口暴漏在activity或fragment中使用。
    expandListView.setOnGroupClickListener 是设置父布局点击事件 返回false会传递父布局的点击展开事件,如需禁用,返回true 。
    适配器adapter中的 getGroupView方法,值得注意的是点击展开事件相当于刷新了一次list 所以展开收缩的事件处理可以放在此处通过isExpanded来判断

    吾生也有涯,而知也無涯。以有涯隨無涯,殆已
  • 相关阅读:
    Power of Cryptography
    Radar Installation
    Emag eht htiw Em Pleh
    Help Me with the Game
    89. Gray Code
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/14630238.html
Copyright © 2011-2022 走看看