日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單

瀏覽:21日期:2022-09-19 15:40:49

前段時間項目的新功能里有些頁面需要三層嵌套列表實現(xiàn),雖然在移動端這種很丑,但是需求就是需求。本來想用各種View嵌套,然后發(fā)現(xiàn)系統(tǒng)有個ExpandableListView。就直接拿來用了。

理論上來說,ExpandableListView的二級嵌套和三級嵌套沒有本質(zhì)區(qū)別,如果把二級嵌套的子級換成一個新的ExpandableListView,就可以實現(xiàn)三級嵌套。

有了思路,關(guān)于ExpandableListView的三層嵌套就直接上手實現(xiàn)

這里說下我的需求是有些數(shù)據(jù)是只有二級,有些數(shù)據(jù)是三級的。如果你的需求是只有三級,不需要考慮三級二級混合的情況,下面有說明怎么處理。

效果圖

Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單

ExpandableListView

ExpandableListView是官方提供的一個可展示折疊列表的控件。

它的基本用法如下

基本用法

ExpandableListView的基本用法很簡單,它本質(zhì)上就是ListView,所以用法也差不多,這里就不介紹了。

Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單

下面開始進(jìn)入正題。

布局文件

先說下,因為是三級嵌套,所以需要四個布局文件,Activity頁面本身需要一個布局文件,然后就是三級嵌套的三個布局文件。

Activity布局文件

<?xml version='1.0' encoding='utf-8'?><LinearLayout xmlns:android='http://schemas.android.com/apk/res/android' android:orientation='vertical' android:layout_width='match_parent' android:layout_height='match_parent'> <ExpandableListView android: android:layout_width='match_parent' android:layout_height='match_parent' android:cacheColorHint='#00000000' android:childIndicator='@color/white' android:divider='@null' android:fadeScrollbars='false' android:groupIndicator='@null' android:listSelector='#00000000' android:scrollbars='none' /></LinearLayout>

我們可以通過ExpandableListView的默認(rèn)屬性來控制部分樣式,這里貼上菜鳥教程的屬性圖片

Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單

一級菜單布局文件

<?xml version='1.0' encoding='utf-8'?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android='http://schemas.android.com/apk/res/android' android:layout_width='match_parent' android:layout_height='44dp' xmlns:app='http://schemas.android.com/apk/res-auto' android:background='@drawable/chapter_gradient_group'> <TextViewandroid: android:layout_width='0dp'android:layout_height='match_parent'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toTopOf='parent'app:layout_constraintBottom_toBottomOf='parent'app:layout_constraintEnd_toEndOf='parent'android:layout_marginHorizontal='10dp'android:paddingStart='20dp'android:singleLine='true'android:ellipsize='end'android:text='@string/groupName'android:textColor='@color/white'android:textSize='16sp'android:gravity='start|center_vertical' /></androidx.constraintlayout.widget.ConstraintLayout>

二級菜單布局文件

<?xml version='1.0' encoding='utf-8'?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' android:layout_width='match_parent' android:layout_height='match_parent' android:background='@drawable/chapter_gradient_child'> <TextViewandroid: android:layout_width='match_parent'android:layout_height='40dp'android:ellipsize='end'android:gravity='start|center_vertical'android:paddingStart='30dp'android:paddingEnd='10dp'android:singleLine='true'android:text='@string/childName'android:textColor='@color/white'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toTopOf='parent' /></androidx.constraintlayout.widget.ConstraintLayout>

三級菜單布局文件

<?xml version='1.0' encoding='utf-8'?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' android:layout_width='match_parent' android:layout_height='match_parent' android:background='@drawable/chapter_gradient_grandson'> <TextViewandroid: android:layout_width='match_parent'android:layout_height='40dp'android:ellipsize='end'android:gravity='start|center_vertical'android:paddingStart='40dp'android:paddingEnd='10dp'android:singleLine='true'android:text='@string/grandsonName'app:layout_constraintEnd_toEndOf='parent'app:layout_constraintStart_toStartOf='parent'app:layout_constraintTop_toTopOf='parent' /></androidx.constraintlayout.widget.ConstraintLayout>Adapter

上面說過ExpandableListView繼承自ListView,所以我們需要Adapter,三級嵌套,我們需要兩個Adapter。

這里有必要說一下,為什么是兩個Adapter,ExpandableListView的Adapter繼承自BaseExpandableListAdapter。需要重寫getGroupView和getChildView。這兩個方法中的view分別inflate父級菜單的布局和子級菜單的布局文件。

所以我們上面的三個級別的菜單布局文件通過兩個Adapter來連接。分別是一級菜單的Adapter和三級菜單的Adapter。

下面給出這兩個Adapter的詳細(xì)說明,需要注意的地方已經(jīng)進(jìn)行備注,請仔細(xì)看備注

一級菜單Adapter最值得注意的是該Adapter的getChildView方法和getChildrenCount。因為有些數(shù)據(jù)不包含三級菜單,有些包含了三級菜單。另外,這個地方需要對下級嵌套的ExpandableListView進(jìn)行處理。

/** * 三級折疊菜單的一級Adapter * * @author StarryRivers */public class ChapterExpandableAdapter extends BaseExpandableListAdapter {... @Override public int getGroupCount() {// 父菜單長度return fatherChapterList.size(); } @Override public int getChildrenCount(int groupPosition) {// 子菜單長度,嵌套所以返回只能1return 1; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {GroupViewHolder groupHolder;// 盡可能重用舊view處理if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_expandable_group_view, parent, false); groupHolder = new GroupViewHolder(); groupHolder.groupTitle = convertView.findViewById(R.id.adapter_title); convertView.setTag(groupHolder);} else { groupHolder = (GroupViewHolder) convertView.getTag();}// 設(shè)置titlegroupHolder.groupTitle.setText(fatherChapterList.get(groupPosition).getName());return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {if (convertView == null) { convertView = new CustomExpandableListView(context);}CustomExpandableListView expandableListView = (CustomExpandableListView) convertView;// 加載子級AdapterChapterExpandableLowAdapter lowAdapter = new ChapterExpandableLowAdapter(context);lowAdapter.setTotalList(fatherChapterList.get(groupPosition).getSec());expandableListView.setAdapter(lowAdapter); if (fatherChapterList.get(groupPosition).getSec().get(childPosition).getThird().size() == 0) { expandableListView.setGroupIndicator(null);}// 本身的父級,相當(dāng)于三級目錄的子級監(jiān)聽expandableListView.setOnGroupClickListener((parent12, v, groupPosition12, id) -> { // 如果第三層size為0,意味著沒有三級菜單 if (fatherChapterList != null && fatherChapterList.size() > 0 && fatherChapterList.get(groupPosition).getSec().get(groupPosition12).getThird().size() == 0) {// TODO 業(yè)務(wù)處理 } // 存在第三級數(shù)據(jù),事件分發(fā)機制繼續(xù)想下傳遞 return false;});expandableListView.setOnChildClickListener((parent1, v, groupPosition1, childPosition1, id) -> { // 三級菜單的業(yè)務(wù)處理 return true;});return expandableListView; } /** * 子列表是否可選,如果為false,則子項不能觸發(fā)點擊事件,默認(rèn)為false * * @param groupPosition groupPosition * @param childPosition childPosition * @return result */ @Override public boolean isChildSelectable(int groupPosition, int childPosition) {return true; } /** * 父級菜單的ViewHolder */ static class GroupViewHolder {TextView groupTitle; }}

三級菜單Adapter三級菜單的Adapter就和普通的二級嵌套時的Adapter相同,沒什么特別注意的地方,所以只列出了getGroupView和getChildView方法代碼

@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {ChapterExpandableLowAdapter.GroupViewHolder groupHolder;// 盡可能重用舊view處理if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_expandable_child_view, parent, false); groupHolder = new ChapterExpandableLowAdapter.GroupViewHolder(); groupHolder.groupTitle = convertView.findViewById(R.id.adapter_child_title); convertView.setTag(groupHolder);} else { groupHolder = (ChapterExpandableLowAdapter.GroupViewHolder) convertView.getTag();}// 設(shè)置titlegroupHolder.groupTitle.setText(childChapterList.get(groupPosition).getName());return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {ChapterExpandableLowAdapter.ChildViewHolder childHolder;if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_expandable_grandson_view, parent, false); childHolder = new ChapterExpandableLowAdapter.ChildViewHolder(); childHolder.childTitle = convertView.findViewById(R.id.adapter_grandson_title); convertView.setTag(childHolder);} else { childHolder = (ChapterExpandableLowAdapter.ChildViewHolder) convertView.getTag();}if (childChapterList.get(groupPosition).getThird() != null && childChapterList.get(groupPosition).getThird().size() > 0) { childHolder.childTitle.setText(childChapterList.get(groupPosition).getThird().get(childPosition).getName());}return convertView; }使用

當(dāng)我們完成了上面的步驟之后,最后就是在Activity中的使用了。使用方法超級簡單

給ExpandableListView設(shè)置Adapter就可以了

@BindView(R.id.chapter_elv) ExpandableListView chapterExpandable; private ChapterExpandableAdapter chapterExpandableAdapter;... chapterExpandableAdapter = new ChapterExpandableAdapter(this); chapterExpandable.setAdapter(chapterExpandableAdapter);寫在最后

因為是三級嵌套,所以ExpandableListView需要重寫一下,重新繪制高度。不然會出現(xiàn)頁面展示不全或者不完整的問題。

以上就是Android使用ExpandableListView實現(xiàn)三層嵌套折疊菜單的詳細(xì)內(nèi)容,更多關(guān)于Android ExpandableListView三層嵌套折疊菜單的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美另类综合| 亚洲精品在线影院| 麻豆91小视频| 日韩av不卡一区二区| 中国字幕a在线看韩国电影| 久久伊人久久| 久久激情五月婷婷| 三级欧美韩日大片在线看| 日韩视频中文| 欧美亚洲国产一区| 欧美aa一级| 精品一区二区三区在线观看视频 | 国产精品久一| 欧美一区激情| 亚洲精品一级| 国产亚洲久久| 国产乱子精品一区二区在线观看 | 日本aⅴ精品一区二区三区| 香蕉久久夜色精品国产| 亚洲欧洲一区| 免费久久精品| 热久久国产精品| 久久xxxx精品视频| 自由日本语亚洲人高潮| 久久国产66| 宅男噜噜噜66国产日韩在线观看| 成人看片网站| 日韩大片在线| a日韩av网址| 国产精品videossex久久发布 | 黄色免费成人| 国产日韩精品视频一区二区三区| 国产精品网在线观看| 青青草91视频| 国产欧美一区二区精品久久久| 69堂免费精品视频在线播放| 一区二区亚洲精品| 蜜桃一区二区三区在线观看| 四虎精品一区二区免费| 国产精品视频一区二区三区四蜜臂 | 久久中文字幕导航| 国产精品亚洲一区二区在线观看| 国产欧美三级| 久久gogo国模啪啪裸体| 99精品网站| 亚洲国产日韩欧美在线| 中文字幕亚洲影视| 国产精一区二区| a天堂资源在线| 亚洲视频二区| 国产精品日本一区二区不卡视频| 国产亚洲一区二区手机在线观看| 激情综合自拍| 国产精品一区二区精品视频观看| 久久三级毛片| 亚洲黄色影院| 99热精品在线观看| 清纯唯美亚洲综合一区| jizzjizz中国精品麻豆| 亚洲特级毛片| 911亚洲精品| а√在线中文在线新版| 一区二区三区午夜视频| 国产精品v亚洲精品v日韩精品| 精品免费av| 午夜亚洲福利在线老司机| 青草国产精品| 亚洲激情精品| 国产精品九九| 久久国产小视频| 欧美日韩亚洲一区在线观看| 精品黄色一级片| 丝瓜av网站精品一区二区| 麻豆一区二区三区| 欧美午夜精彩| 国产精品最新| 国产字幕视频一区二区| 国产精品66| 久久蜜桃精品| 国产精品毛片久久久| 在线日韩中文| 日韩精品免费一区二区在线观看| 日本亚洲最大的色成网站www| 国语精品一区| 日韩av一区二区在线影视| 日本在线啊啊| 久久国内精品视频| 99久久夜色精品国产亚洲1000部| 最近国产精品视频| 99精品视频在线观看免费播放| 日本精品在线播放| 久久人人99| 国产精品啊v在线| 亚洲影院天堂中文av色| 91综合网人人| 日韩在线观看中文字幕| 99久久亚洲精品蜜臀| 国产乱人伦丫前精品视频 | 在线一区视频观看| 日韩欧美久久| 91亚洲成人| 欧美激情视频一区二区三区免费 | 91亚洲精品在看在线观看高清| 在线亚洲观看| av中文字幕在线观看第一页 | 国产中文欧美日韩在线| 日韩精品三级| 99香蕉国产精品偷在线观看 | 亚洲综合不卡| 999久久久亚洲| 久久中文欧美| 国产亚洲字幕| 欧美综合二区| 老鸭窝毛片一区二区三区| 精品伊人久久| 日韩精品福利一区二区三区| 在线一区二区三区视频| 毛片在线网站| 电影91久久久| 国产精品视频首页| 国产精品第十页| 天堂av一区| 亚洲1区在线| 亚洲免费高清| 国产婷婷精品| av一区二区高清| 91久久国产| 国产午夜精品一区二区三区欧美 | 亚洲tv在线| 亚洲精品四区| 蜜桃tv一区二区三区| 成人在线丰满少妇av| 日产午夜精品一线二线三线| 欧美在线看片| 国产日韩亚洲欧美精品| 在线精品小视频| 亚洲一卡久久| 午夜一级久久| 日韩一区二区三区精品| 亚洲a级精品| 国产精品一区二区免费福利视频| 欧美一级全黄| 久久婷婷亚洲| 91欧美在线| 国产suv精品一区二区四区视频 | 日韩亚洲精品在线| 久久精品国产亚洲夜色av网站| 国内精品福利| 欧美日韩高清| 狠狠干成人综合网| 日韩免费精品| 久久国产精品免费一区二区三区| 国产精品亚洲一区二区在线观看 | 久久中文在线| 日韩高清欧美| 91看片一区| 午夜欧美精品| 六月婷婷一区| 青青伊人久久| 国产欧美激情| 精品视频在线你懂得| 99久久精品费精品国产| 99精品一区| 亚洲精品在线国产| 亚洲精品四区| 国产亚洲第一伦理第一区| 久久成人av| 久久久久免费| 精品九九在线| 国产综合精品| 蜜臀av亚洲一区中文字幕| 国产精品色在线网站| 成人国产精选| 亚洲黄色在线| 亚洲精品日本| 精品五月天堂| 99亚洲视频| 国产日韩免费| 欧美日韩一区二区三区视频播放| 黄色日韩精品| 久久影院一区二区三区| 香蕉成人av| 视频在线观看国产精品| 99亚洲视频| 欧美日韩1区2区3区| 亚洲成a人片| 91麻豆精品激情在线观看最新| 美女视频黄 久久| 亚洲作爱视频| 国产日韩亚洲欧美精品| 欧美日韩国产v| 99国产成+人+综合+亚洲欧美| 视频一区视频二区中文| 亚洲狼人精品一区二区三区| 日韩成人三级| 蜜臀久久久99精品久久久久久| 国产一区二区三区网| 国户精品久久久久久久久久久不卡| 国产精品美女久久久| 国产女人18毛片水真多18精品|