Android二級列表有許多實現方式,如兩個recyclerview嵌套,如想要簡單實用子列表展開收縮的功能使用expandablelistview較爲簡單。android
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); } }
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中使用。佈局