成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

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

理論上來(lái)說(shuō),ExpandableListView的二級(jí)嵌套和三級(jí)嵌套沒(méi)有本質(zhì)區(qū)別,如果把二級(jí)嵌套的子級(jí)換成一個(gè)新的ExpandableListView,就可以實(shí)現(xiàn)三級(jí)嵌套。

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

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

效果圖

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

ExpandableListView

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

它的基本用法如下

基本用法

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

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

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

布局文件

先說(shuō)下,因?yàn)槭侨?jí)嵌套,所以需要四個(gè)布局文件,Activity頁(yè)面本身需要一個(gè)布局文件,然后就是三級(jí)嵌套的三個(gè)布局文件。

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>

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

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

一級(jí)菜單布局文件

<?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>

二級(jí)菜單布局文件

<?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>

三級(jí)菜單布局文件

<?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

上面說(shuō)過(guò)ExpandableListView繼承自ListView,所以我們需要Adapter,三級(jí)嵌套,我們需要兩個(gè)Adapter。

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

所以我們上面的三個(gè)級(jí)別的菜單布局文件通過(guò)兩個(gè)Adapter來(lái)連接。分別是一級(jí)菜單的Adapter和三級(jí)菜單的Adapter。

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

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

/** * 三級(jí)折疊菜單的一級(jí)Adapter * * @author StarryRivers */public class ChapterExpandableAdapter extends BaseExpandableListAdapter {... @Override public int getGroupCount() {// 父菜單長(zhǎng)度return fatherChapterList.size(); } @Override public int getChildrenCount(int groupPosition) {// 子菜單長(zhǎng)度,嵌套所以返回只能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;// 加載子級(jí)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);}// 本身的父級(jí),相當(dāng)于三級(jí)目錄的子級(jí)監(jiān)聽(tīng)expandableListView.setOnGroupClickListener((parent12, v, groupPosition12, id) -> { // 如果第三層size為0,意味著沒(méi)有三級(jí)菜單 if (fatherChapterList != null && fatherChapterList.size() > 0 && fatherChapterList.get(groupPosition).getSec().get(groupPosition12).getThird().size() == 0) {// TODO 業(yè)務(wù)處理 } // 存在第三級(jí)數(shù)據(jù),事件分發(fā)機(jī)制繼續(xù)想下傳遞 return false;});expandableListView.setOnChildClickListener((parent1, v, groupPosition1, childPosition1, id) -> { // 三級(jí)菜單的業(yè)務(wù)處理 return true;});return expandableListView; } /** * 子列表是否可選,如果為false,則子項(xiàng)不能觸發(fā)點(diǎn)擊事件,默認(rèn)為false * * @param groupPosition groupPosition * @param childPosition childPosition * @return result */ @Override public boolean isChildSelectable(int groupPosition, int childPosition) {return true; } /** * 父級(jí)菜單的ViewHolder */ static class GroupViewHolder {TextView groupTitle; }}

三級(jí)菜單Adapter三級(jí)菜單的Adapter就和普通的二級(jí)嵌套時(shí)的Adapter相同,沒(méi)什么特別注意的地方,所以只列出了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中的使用了。使用方法超級(jí)簡(jiǎn)單

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

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

因?yàn)槭侨?jí)嵌套,所以ExpandableListView需要重寫(xiě)一下,重新繪制高度。不然會(huì)出現(xiàn)頁(yè)面展示不全或者不完整的問(wèn)題。

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

標(biāo)簽: Android
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美精品少妇一区二区三区| 1区2区3区国产精品| 色8久久精品久久久久久蜜| 国产精品久久影院| 亚洲激情偷拍| 国产欧美精品国产国产专区| 免费观看日韩av| 9色精品在线| 欧美一级一区二区| 国产精品国产馆在线真实露脸| 精品99视频| 一区二区三区中文字幕精品精品 | 亚洲一线二线三线视频| gogo大胆日本视频一区| 2021国产精品久久精品| 欧美大片专区| 亚洲精品免费播放| 裸体一区二区| 精品一区二区三区不卡| 国产视频一区不卡| 国产亚洲欧美一区二区| 欧洲亚洲精品在线| 亚洲国产美国国产综合一区二区| 黑人一区二区| 另类人妖一区二区av| 欧美bbbxxxxx| 亚洲成人免费观看| 日韩欧美不卡一区| 波多野结衣在线aⅴ中文字幕不卡| 国产精品你懂的| 欧美午夜一区二区三区| 欧美日韩精品免费看| 免费看欧美美女黄的网站| 欧美日韩免费电影| 亚洲国产电影| 国产成人8x视频一区二区| 亚洲免费观看高清完整版在线观看熊| 国产一区二区黄色| 理论电影国产精品| ...中文天堂在线一区| 在线成人av网站| 日韩视频精品| 国产中文字幕精品| 中文字幕第一区| 91福利国产精品| 国产婷婷精品| 欧美+日本+国产+在线a∨观看| 日韩电影网1区2区| 国产精品乱码一区二区三区软件 | 国产精品资源站在线| 久久久久久久久免费| 欧美日韩免费在线视频| 国产视频精品网| 国产精品豆花视频| a亚洲天堂av| 成人小视频免费在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美成人精品福利| 精品国产凹凸成av人网站| 国产亚洲精品久| 亚洲你懂的在线视频| 美女视频黄久久| 国产a视频精品免费观看| 91丨porny丨在线| 93久久精品日日躁夜夜躁欧美| 欧美福利一区| 亚洲综合日本| 日韩欧美国产午夜精品| 国产精品你懂的| 视频一区中文字幕国产| 国产一区高清在线| 欧美在线亚洲| 久久国产欧美精品| 精品欧美黑人一区二区三区| 中文字幕一区二区三中文字幕| 亚洲狠狠爱一区二区三区| 蜜桃视频在线一区| 懂色av一区二区三区免费观看 | 久久午夜精品| 2021中文字幕一区亚洲| 国产精品福利在线播放| 偷偷要91色婷婷| 成人午夜短视频| 一区一区视频| 色欧美88888久久久久久影院| 日韩欧美高清dvd碟片| 中文字幕高清不卡| 久久99国产精品免费| 很黄很黄激情成人| 午夜在线一区二区| 亚洲一区二区av在线| 日韩一区二区电影网| 中文精品视频一区二区在线观看| 国产一区91精品张津瑜| 日韩一区在线看| 欧美人妇做爰xxxⅹ性高电影| 欧美淫片网站| 日韩av中文字幕一区二区| 久久免费视频色| 日本道色综合久久| 欧美日韩高清免费| 成人免费毛片嘿嘿连载视频| 极品裸体白嫩激情啪啪国产精品| 日韩福利视频网| 国产精品a久久久久| 91精品国产手机| 免费精品视频在线| 99一区二区| 欧美韩国日本不卡| 亚洲国产精品www| 久久不见久久见免费视频7 | 天天做天天摸天天爽国产一区| 日韩无一区二区| 亚洲综合在线电影| 91丨porny丨蝌蚪视频| 51久久夜色精品国产麻豆| 日韩精品国产精品| 国产日韩一区二区三区在线播放| 中文字幕高清一区| 91老司机福利 在线| 欧美羞羞免费网站| 亚洲一区二区三区四区在线| 欧美国内亚洲| 欧美高清视频不卡网| 免费看日韩a级影片| 岛国精品一区二区| 全国精品久久少妇| 中文字幕一区二区三区蜜月| 在线综合视频播放| 久久久久久九九九九| 亚洲图片在线| 成年人午夜久久久| 麻豆视频观看网址久久| 亚洲免费高清视频在线| 久久老女人爱爱| 欧美精品久久一区| 91成人国产精品| 亚洲女人av| 日韩一级欧洲| 狠狠综合久久| 成人av电影在线播放| 在线日本高清免费不卡| 久久欧美肥婆一二区| 婷婷综合五月天| 在线欧美日韩精品| 国产成人免费视频| 久久免费看少妇高潮| 欧美1区2区3区| 中文字幕一区在线观看| 亚洲激情网址| 亚洲成人资源在线| 欧美精品aⅴ在线视频| 成人av电影在线观看| 国产天堂亚洲国产碰碰| 欧美午夜一区二区福利视频| 国产欧美一区二区在线观看| 欧美少妇一区| 一区二区在线观看免费| 麻豆九一精品爱看视频在线观看免费| 亚洲国产欧美在线| 久久精品官网| 国产在线视频一区二区| 日韩视频在线观看一区二区| av一区二区三区四区| 亚洲欧洲性图库| 久久激情综合| 国产伦精品一区二区三区在线观看 | 99v久久综合狠狠综合久久| 国产亚洲一二三区| 亚洲黄色三级| 久草中文综合在线| 国产精品毛片大码女人 | 一区二区不卡在线播放| 欧美日精品一区视频| 91在线观看一区二区| 一区二区三区在线视频播放| 日本道色综合久久| 波多野结衣欧美| 天堂影院一区二区| 精品久久久久久亚洲综合网 | 国产精品理论在线观看| 久久蜜桃资源一区二区老牛| 成人黄色小视频| 天堂蜜桃91精品| 国产欧美精品一区二区色综合朱莉 | 欧美影院精品一区| 欧美涩涩网站| 久久99九九99精品| 国产精品三级久久久久三级| 欧美在线免费观看视频| 午夜精品久久99蜜桃的功能介绍| 亚洲大片精品永久免费| 久久精品日产第一区二区三区高清版| 裸体丰满少妇做受久久99精品| 女女同性女同一区二区三区91| 精品一区二区三区免费播放| 亚洲午夜精品17c| 亚洲国产高清在线观看视频| 欧美一区二区视频网站| 久久精品男女|