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来判断

    吾生也有涯,而知也無涯。以有涯隨無涯,殆已
  • 相关阅读:
    【hdu 2222】Keywords Search
    【codeforces 750E】New Year and Old Subsequence
    Bit error testing and training in double data rate (ddr) memory system
    北风网09.接收普通消息2
    北风网08.接收普通消息1
    慕课网消息的接收与响应2
    MyEclipse/eclipse 添加作者、注释、版本、时间等
    北风网开发者接入
    java.lang.Error: Unresolved compilation problem: 解决方案
    北风网环境搭建二
  • 原文地址:https://www.cnblogs.com/baimiyishu/p/14630238.html
Copyright © 2011-2022 走看看