Android 開發學習進程0.31 二級列表 ExpandableListView使用相關

二級列表ExpandableListView

Android二級列表有許多實現方式,如兩個recyclerview嵌套,如想要簡單實用子列表展開收縮的功能使用expandablelistview較爲簡單。android

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

adapter繼承了baseExpandableListView ,其中的內容下面再講,setDivider方法是設置分割線,設計途中不須要就能夠直接設置爲空,setGroupIndicator方法設置指示器,也就是展開子列表的標誌,默認是一個小三角,也能夠直接設置爲空,同時佈局文件設置了 android:scrollbars="none" 設置滾動條爲空。在數據變化後使用 expandAdapter.notifyDataSetChanged();更改列表數據。
2. adapter的使用方法
這裏只貼出一些主要代碼和簡單使用須要重寫的方法,初始化方法是傳context和須要的數據。
getGroupCont方法是父列表的長度,須要傳外層數據數量,同理getChildrenCount方法返回父列表中的子列表數量。
下面是重點須要重寫的方法,首先自定義viewholder類,構造方法是父佈局和子佈局的convertView,在其中添加定義佈局中的組件,分別在getGroupView 和getChildView中初始化,注意這兩個方法是會屢次使用,同時convertview也可能會被複用。能夠在此再定義recyclerview實現三級列表效果。同時須要修改isChildSelectable方法返回值爲true,不然子項點擊事件會不起做用。ide

@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中使用。佈局

相關文章
相關標籤/搜索