Android开发实践:多级列表的封装与应用

简介:

   Android中多级列表可以使用ExpandableListView和SimpleExpandableListAdapter配合来实现,但是,SimpleExpandableListAdapter用起来挺麻烦的,不易理解,而且扩展性也不好,因此,自定义BaseExpandableListAdapter类的子类以及封装相关的操作,用起来会更加直观和方便,我把我设计的封装贴出来供新手参考吧。


   首先上效果图,如图所示:


224351468.png


1. 首先设计多级列表的标题类


就像文件和文件夹可以统一地用File类来抽象一样,多级列表的一级标题和二级标题其实也可以用同一个基类来抽象,因此,我设计了一个基类和两个子类,GroupList,GroupListChild 和 GroupListParent,其实现如下所示:


(1) GroupList 多级列表标题的抽象基类


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  abstract  class  GroupList {
     private  final  String mTitle;
                                                                                                                                                                                                                                                                            
     public  GroupList(String title) {
         mTitle = title;
     }
                                                                                                                                                                                                                                                                            
     public  String getTitle() {
         return  mTitle;
     }
                                                                                                                                                                                                                                                                            
     public  abstract  List<GroupList> getChild();
                                                                                                                                                                                                                                                                            
     public  abstract  int  getResource();     
     public  abstract  void  buildView(View v);
}


(2) GroupListChild 多级列表二级标题子类


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public  class  GroupListChild  extends  GroupList {
                                                                                                                                                                                                                                  
     public  GroupListChild(String title) {
         super (title);      
     }
                                                                                                                                                                                                                               
     @Override
     public  int  getResource() {
         return  R.layout.grouplist_child;
     }
                                                                                                                                                                                                                               
     @Override
     public  List<GroupList> getChild() {     
         return  null ;
     }
                                                                                                                                                                                                                               
     @Override
     public  void  buildView(View v) {
                                                                                                                                                                                                                                      
         TextView textView  = (TextView)v.findViewById(R.id.GroupListChild);                   
         textView.setText(getTitle());
    
}


(3) GroupListParent 多级列表一级标题子类


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public  class  GroupListParent  extends  GroupList {
                                                                                                                                                                                                                   
     private  List<GroupList> mPopListChilds;
                                                                                                                                                                                                                       
     public  GroupListParent(String title,List<GroupList> childs) {
         super (title);      
         mPopListChilds = childs;
     }
                                                                                                                                                                                                                   
     @Override
     public  int  getResource() {
         return  R.layout.grouplist_parent;
     }
                                                                                                                                                                                                                   
     @Override
     public  List<GroupList> getChild() {
         return  mPopListChilds;
     }
                                                                                                                                                                                                                       
     @Override
     public  void  buildView(View v) {
                                                                                                                                                                                                                                  
         TextView textView = (TextView)v.findViewById(R.id.GroupListParent);              
         textView.setText(getTitle());
     }
}


2.  设计BaseExpandableListAdapter的子类


我设计的子类是一种通用的Adapter子类,类的实现中并不包含具体的Layout实现,所有的Layout都由GroupList的getResource和buildView来负责,因此,可以非常灵活地修改Layout的具体实现,而不用修改Adapter的代码。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public  class  GroupListAdapter  extends  BaseExpandableListAdapter {
                                                                                                                                                                              
     private  Context mContext;
     private  List<GroupList> mGroups;
                                                                                                                                                                                  
     public  GroupListAdapter(Context context, List<GroupList> groups) {
         this .mContext = context;
         this .mGroups  = groups;
     }
                                                                                                                                                                                  
     @Override
     public  Object getChild( int  groupPosition,  int  childPosition) {
                                                                                                                                                                                     
         List<GroupList> chList = mGroups.get(groupPosition).getChild();
         if ( chList ==  null ) {
             return  null ;
         }
                                                                                                                                                                                      
         return  chList.get(childPosition);
     }
                                                                                                                                                                              
     @Override
     public  long  getChildId( int  groupPosition,  int  childPosition) {
                                                                                                                                                                               
         return  childPosition;
     }
                                                                                                                                                                                
     @Override
     public  View getChildView( int  groupPosition,  int  childPosition,  boolean  isLastChild, View view,ViewGroup parent) {
                                                                                                                                                                                                                     
         GroupList child = (GroupList)getChild(groupPosition, childPosition);
         if ( child ==  null ) {
             return  null ;
         }
                                                                                                                                                                                          
         if  (view ==  null ) {   
             LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        
             view = (RelativeLayout)inflater.inflate(child.getResource(),  null );
         }
                                                                                                                                                                                           
         child.buildView(view);
                                                                                                                                                                                     
         return  view;
     }
                                                                                                                                                                                
     @Override
     public  int  getChildrenCount( int  groupPosition) {
                                                                                                                                                                                     
         List<GroupList> chList = mGroups.get(groupPosition).getChild();
         if ( chList ==  null ) {
             return  0 ;
         }
                                                                                                                                                                                     
         return  chList.size();
     }
                                                                                                                                                                                
     @Override
     public  Object getGroup( int  groupPosition) {
         return  mGroups.get(groupPosition);
     }
                                                                                                                                                                                
     @Override
     public  int  getGroupCount() {
         return  mGroups.size();
     }
                                                                                                                                                                                
     @Override
     public  long  getGroupId( int  groupPosition) {
         return  groupPosition;
     }
                                                                                                                                                                                
     @Override
     public  View getGroupView( int  groupPosition,  boolean  isLastChild, View view,ViewGroup parent) {
                                                                                                                                                                               
         GroupList group = (GroupList)getGroup(groupPosition);
                                                                                                                                                                                       
         if  (view ==  null ) {
                                                                                                                                                                                
             LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        
             view = (RelativeLayout)inflater.inflate(group.getResource(),  null );  
         }
                                                                                                                                                                                
         group.buildView(view);
                                                                                                                                                                                     
         return  view;
     }
                                                                                                                                                                                
     @Override
     public  boolean  hasStableIds() {
         return  true ;
     }
                                                                                                                                                                                
     @Override
     public  boolean  isChildSelectable( int  arg0,  int  arg1) {
         return  true ;
     }
}


3.  应用代码


为了简化,我就直接在MainActivity中使用上述封装的类来完成多级列表的功能演示,示例如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public  class  MainActivity  extends  Activity  implements  OnGroupClickListener,OnChildClickListener {
                                                                                                                                              
     private  ExpandableListView mlistView; 
     private  GroupListAdapter mAdapter;
                                                                                                                                                  
     private  static  final  String[] mParentMenu = {
         "Book" "Video" "Audio"
     };
                                                                                                                                                  
     private  static  final  String[][] mChildMenu = {
         "book1" "book2" "book3" "book4"  },
         "video1" "video2"  },
         "audio1" "audio2" "audio3" , "audio4" }
     };
                                                                                                                                                  
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
                                                                                                                                                            
         mlistView =  new  ExpandableListView( this );                      
         mlistView.setOnGroupClickListener( this );      
         mlistView.setOnChildClickListener( this );
                                                                                                                                                       
         List<GroupList> groups =  new  ArrayList<GroupList>();
         for int  i= 0 ; i<mParentMenu.length; i++) {         
             List<GroupList> childs =  new  ArrayList<GroupList>();
             for int  j= 0 ; j<mChildMenu[i].length; j++ ) {
                 childs.add( new  GroupListChild(mChildMenu[i][j]));
             }
             groups.add( new  GroupListParent(mParentMenu[i],childs));
         }
                                                                                                                                              
         mAdapter =  new  GroupListAdapter( this ,groups);
         mlistView.setAdapter(mAdapter);
                                                                                                                                                      
         setContentView(mlistView);    
     }
                                                                                                                                              
     @Override
     public  boolean  onChildClick(ExpandableListView parent, View v, int  groupPosition,  int  childPosition,  long  id) {
                                                                                                                                                      
         return  false ;
     }
                                                                                                                                              
     @Override
     public  boolean  onGroupClick(ExpandableListView parent, View v, int  groupPosition,  long  id) {
                                                                                                                                                    
         return  false ;
     }
}


4.  相关的xml文件


(1) grouplist_child.xml 文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<? xml  version = "1.0"  encoding = "utf-8" ?>
< RelativeLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"
     android:orientation = "horizontal" >
                                                                                                                                      
     < TextView
         android:id = "@+id/GroupListChild"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:textColor = "#FFFF0000"
         android:layout_margin = "10dp"
         android:layout_centerInParent = "true" />
                                                                                                                                      
</ RelativeLayout >


(2) grouplist_parent.xml 文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? xml  version = "1.0"  encoding = "utf-8" ?>
< RelativeLayout  xmlns:android = "http://schemas.android.com/apk/res/android"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"
     android:orientation = "horizontal" >
                                                                                                           
     < TextView
         android:id = "@+id/GroupListParent"
         android:layout_width = "wrap_content"
         android:layout_height = "wrap_content"
         android:textColor = "@android:color/black"
         android:textStyle = "bold"
         android:layout_margin = "10dp"
         android:layout_centerInParent = "true" />
                                                                                                           
</ RelativeLayout >




本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1289642,如需转载请自行联系原作者

相关文章
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
290 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
245 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
590 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
3月前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
524 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
2月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
149 0
|
移动开发 安全 Android开发
构建高效Android应用:Kotlin协程的实践与优化策略
【5月更文挑战第30天】 在移动开发领域,性能优化始终是关键议题之一。特别是对于Android开发者来说,如何在保证应用流畅性的同时,提升代码的执行效率,已成为不断探索的主题。近年来,Kotlin语言凭借其简洁、安全和实用的特性,在Android开发中得到了广泛的应用。其中,Kotlin协程作为一种新的并发处理机制,为编写异步、非阻塞性的代码提供了强大工具。本文将深入探讨Kotlin协程在Android开发中的应用实践,以及如何通过协程优化应用性能,帮助开发者构建更高效的Android应用。
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第17天】在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。针对Android平台,Kotlin语言凭借其简洁性和功能丰富性成为了许多开发者的首选。其中,Kotlin协程作为异步编程的强大工具,为处理并发任务提供了轻量级的解决方案。本文深入探讨了Kotlin协程的核心优势,并通过实例分析其在Android开发中的应用,旨在帮助开发者提升应用的性能和响应能力。
|
API 调度 Android开发
打造高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】在移动开发领域,性能优化和响应速度是衡量应用质量的关键因素。随着Kotlin语言的普及,协程作为其核心特性之一,为Android开发者提供了一种全新的并发处理方式。本文深入探讨了Kotlin协程在Android应用开发中的优势,并通过实例演示如何在实际项目中有效利用协程提升应用性能和用户体验。
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第21天】在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着Kotlin语言在Android平台的广泛采纳,其并发处理的强大工具—协程(Coroutines),已成为提升应用响应性和效率的关键因素。本文将深入分析Kotlin协程的核心原理,探讨其在Android开发中的优势,并通过实例演示如何有效利用协程来优化应用性能,打造更加流畅的用户体验。
151 4
|
物联网 区块链 Android开发
构建高效Android应用:Kotlin与Jetpack的实践之路未来技术的融合潮流:区块链、物联网与虚拟现实的交汇点
【5月更文挑战第30天】 在移动开发领域,效率和性能始终是开发者追求的核心。随着技术的不断进步,Kotlin语言以其简洁性和现代化特性成为Android开发的新宠。与此同时,Jetpack组件为应用开发提供了一套经过实践检验的库、工具和指南,旨在简化复杂任务并帮助提高应用质量。本文将深入探索如何通过Kotlin结合Jetpack组件来构建一个既高效又稳定的Android应用,并分享在此过程中的最佳实践和常见陷阱。