├── .gitattributes ├── .gitignore ├── MultiMenuSelectDemo ├── .gitignore ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── gradle.xml │ ├── misc.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ └── vcs.xml ├── MultiMenuSelectDemo.iml ├── app │ ├── .gitignore │ ├── app.iml │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ └── position_function.txt │ │ ├── java │ │ └── com │ │ │ └── mulitmenuselect │ │ │ └── demo │ │ │ ├── HomeActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── adapter │ │ │ ├── DictDialogAdapter.java │ │ │ ├── MyPagerAdapter.java │ │ │ └── ViewHolder.java │ │ │ ├── dialog │ │ │ ├── DictDataManager.java │ │ │ ├── DictUnit.java │ │ │ ├── DictUtil.java │ │ │ ├── MultiDialog.java │ │ │ └── ThirdDialog.java │ │ │ └── widget │ │ │ └── MyViewPager.java │ │ └── res │ │ ├── anim │ │ ├── attention_guide_in.xml │ │ └── attention_guide_out.xml │ │ ├── drawable-hdpi │ │ └── ic_launcher.png │ │ ├── drawable-mdpi │ │ └── ic_launcher.png │ │ ├── drawable-xhdpi │ │ ├── ic_launcher.png │ │ ├── select_gray.9.png │ │ └── select_white.9.png │ │ ├── drawable-xxhdpi │ │ └── ic_launcher.png │ │ ├── layout │ │ ├── activity_home.xml │ │ ├── activity_main.xml │ │ ├── layout_dialog.xml │ │ ├── layout_dict_item.xml │ │ ├── layout_dictdialog_container.xml │ │ └── page1.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── color.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── README.md └── image └── screenshot.gif /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/.name: -------------------------------------------------------------------------------- 1 | MultiMenuSelectDemo -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Android Lint 18 | 19 | 20 | Gradle 21 | 22 | 23 | Probable bugsGradle 24 | 25 | 26 | 27 | 28 | Abstraction issues 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 56 | 57 | 58 | 76 | 83 | 84 | 97 | 98 | 99 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 127 | 128 | 130 | 131 | localhost 132 | 5050 133 | 134 | 135 | 136 | 137 | 138 | 139 | 1.7 140 | 141 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/MultiMenuSelectDemo.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 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 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 21 5 | buildToolsVersion "21.1.2" 6 | 7 | defaultConfig { 8 | applicationId "com.mulitmenuselect.demo" 9 | minSdkVersion 8 10 | targetSdkVersion 21 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | compile 'com.android.support:appcompat-v7:21.0.3' 25 | } 26 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Program Files\android\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/assets/position_function.txt: -------------------------------------------------------------------------------- 1 | 0,不限,0; 2 | 310000,IT/互联网/软件/通信,0; 3 | 310100,产品,310000; 4 | 310101,产品专员/产品助理,310100; 5 | 310102,产品经理/高级产品经理,310100; 6 | 310103,产品总监/副总监,310100; 7 | 310104,产品VP/首席产品官,310100; 8 | 310105,其他产品类职位,310100; 9 | 310200,设计,310000; 10 | 310201,网页设计/网站美工,310200; 11 | 310202,APP设计,310200; 12 | 310203,UI/UE/交互设计,310200; 13 | 310204,Flash/多媒体设计,310200; 14 | 310205,游戏设计,310200; 15 | 310206,设计经理/主美,310200; 16 | 310207,设计总监/副总监,310200; 17 | 310208,其他设计类职位,310200; 18 | 310300,编程/IT研发,310000; 19 | 310301,软件工程师,310300; 20 | 310302,前端工程师,310300; 21 | 310303,后端工程师,310300; 22 | 310304,APP开发工程师,310300; 23 | 310305,游戏开发工程师,310300; 24 | 310306,算法工程师,310300; 25 | 310307,大数据工程师,310300; 26 | 310308,云计算工程师,310300; 27 | 310309,需求工程师,310300; 28 | 310310,架构师,310300; 29 | 310311,技术经理/IT项目经理,310300; 30 | 310312,技术总监/IT项目总监,310300; 31 | 310313,技术VP/CTO/CIO,310300; 32 | 310314,Java开发,310300; 33 | 310315,.NET开发,310300; 34 | 310316,Php开发,310300; 35 | 310317,C/C++开发,310300; 36 | 310318,VC++开发,310300; 37 | 310319,C#开发,310300; 38 | 310320,Android开发,310300; 39 | 310321,iOS开发,310300; 40 | 310322,Flash开发,310300; 41 | 310323,Unity3d/U3D,310300; 42 | 310324,COCOS2D-X,310300; 43 | 310325,Python开发,310300; 44 | 310326,Delphi开发,310300; 45 | 310327,Flex开发,310300; 46 | 310328,Linux/Unix开发,310300; 47 | 310329,Windows开发,310300; 48 | 310330,其他研发类职位,310300; 49 | 310400,测试/QA,310000; 50 | 310401,测试工程师/测试员,310400; 51 | 310402,测试开发工程师,310400; 52 | 310403,产品评测/质量分析,310400; 53 | 310404,测试经理/QA主管,310400; 54 | 310405,测试总监/QA总监,310400; 55 | 310406,其他IT质量管理类职位,310400; 56 | 310500,IT运维/网络管理,310000; 57 | 310501,运维工程师,310500; 58 | 310502,网络工程师,310500; 59 | 310503,网络管理员/IT专员,310500; 60 | 310504,数据库工程师/DBA,310500; 61 | 310505,服务器工程师,310500; 62 | 310506,信息安全工程师,310500; 63 | 310507,IT设备管理/IT资源管理,310500; 64 | 310508,IT运维总监/运维经理,310500; 65 | 310509,其他运维类职位,310500; 66 | 310600,通信工程/物联网开发,310000; 67 | 310601,通信工程师,310600; 68 | 310602,移动通信/无线通信,310600; 69 | 310603,卫星通信/RS/GIS/GPS,310600; 70 | 310604,微波/射频/RFID/NFC,310600; 71 | 310605,有线通信/光纤通信,310600; 72 | 310606,传输/接入/交换技术,310600; 73 | 310607,信号处理/通信算法,310600; 74 | 310608,物联网工程师,310600; 75 | 310609,传感技术工程师,310600; 76 | 310610,通信工程项目经理,310600; 77 | 310611,其他通信研发类职位,310600; 78 | 310700,运营,310000; 79 | 310701,运营专员/助理,310700; 80 | 310702,内容运营/网站编辑,310700; 81 | 310703,信息审核员/鉴黄师,310700; 82 | 310704,产品运营,310700; 83 | 310705,用户运营/数据分析,310700; 84 | 310706,市场运营/活动运营,310700; 85 | 310707,电商运营/电子商务专员,310700; 86 | 310708,游戏运营,310700; 87 | 310709,网络推广/渠道拓展,310700; 88 | 310710,SEO/SEM,310700; 89 | 310711,运营经理/主管,310700; 90 | 310712,运营总监/COO,310700; 91 | 310713,其他运营类职位,310700; 92 | 320000,销售/客服/市场/公关,0; 93 | 320100,销售人员,320000; 94 | 320101,销售员/业务员,320100; 95 | 320102,销售代表/商务代表,320100; 96 | 320103,客户代表/KA销售,320100; 97 | 320104,销售顾问/商务顾问,320100; 98 | 320105,销售工程师,320100; 99 | 320106,电话销售/坐席代表,320100; 100 | 320107,网络/在线销售,320100; 101 | 320108,会议/会展/活动销售,320100; 102 | 320109,渠道销售,320100; 103 | 320110,区域销售,320100; 104 | 320111,业务拓展/BD专员,320100; 105 | 320112,招商专员/助理,320100; 106 | 320113,分销员/经销员/代理,320100; 107 | 320114,零售终端/直销员,320100; 108 | 320115,团购业务员,320100; 109 | 320116,销售管理培训生,320100; 110 | 320117,其他销售员类职位,320100; 111 | 320200,销售高级管理,320000; 112 | 320201,销售经理/主管,320200; 113 | 320202,销售总监,320200; 114 | 320203,客户经理/KA经理,320200; 115 | 320204,客户总监/KA总监,320200; 116 | 320205,业务拓展/BD经理,320200; 117 | 320206,业务拓展/BD总监,320200; 118 | 320207,经销商/代理商管理,320200; 119 | 320208,渠道销售总监/经理,320200; 120 | 320209,区域经理/大区经理,320200; 121 | 320210,区域总监/大区总监,320200; 122 | 320211,招商经理/主管,320200; 123 | 320212,招商总监,320200; 124 | 320213,团购总监/经理/主管,320200; 125 | 320214,零售/直销经理/主管,320200; 126 | 320215,零售终端/直销总监,320200; 127 | 320216,网络/在线销售总监/经理,320200; 128 | 320217,其他销售高级类职位,320200; 129 | 320300,商务/销售督导/销管,320000; 130 | 320301,商务专员/商务助理,320300; 131 | 320302,商务经理/主管,320300; 132 | 320303,商务总监,320300; 133 | 320304,招标/投标人员,320300; 134 | 320305,销售运营/业务分析,320300; 135 | 320306,销售督导/销售培训师,320300; 136 | 320307,销管专员/销售行政,320300; 137 | 320308,销管经理/销售行政经理,320300; 138 | 320309,其他销管类职位,320300; 139 | 320400,销售支持/客户服务,320000; 140 | 320401,销售支持专员/助理,320400; 141 | 320402,售前/售后支持工程师,320400; 142 | 320403,销售支持经理/主管,320400; 143 | 320404,销售支持总监,320400; 144 | 320405,客服专员/助理,320400; 145 | 320406,呼叫中心/电话客服,320400; 146 | 320407,网络/在线客服,320400; 147 | 320408,客户服务经理/主管,320400; 148 | 320409,客户服务总监,320400; 149 | 320410,其他服务支持类职位,320400; 150 | 320500,市场/渠道/促销,320000; 151 | 320501,市场专员/市场助理,320500; 152 | 320502,市场经理/市场主管,320500; 153 | 320503,市场总监,320500; 154 | 320504,市场策划/文案/企划,320500; 155 | 320505,策划经理/企划经理,320500; 156 | 320506,市场推广专员/助理,320500; 157 | 320507,市场推广经理/主管,320500; 158 | 320508,渠道专员/渠道助理,320500; 159 | 320509,渠道总监/渠道经理,320500; 160 | 320510,促销专员/助理,320500; 161 | 320511,促销经理/主管,320500; 162 | 320512,市场调研/分析,320500; 163 | 320513,其他市场营销类职位,320500; 164 | 320600,产品/品牌,320000; 165 | 320601,产品专员/品牌专员,320600; 166 | 320602,产品经理/品牌经理,320600; 167 | 320603,产品总监/品牌总监,320600; 168 | 320604,其他产品管理类职位,320600; 169 | 320700,公关/媒介,320000; 170 | 320701,公关专员/公关助理,320700; 171 | 320702,公关总监/公关经理,320700; 172 | 320703,媒介专员/媒介助理,320700; 173 | 320704,媒介总监/媒介经理,320700; 174 | 320705,其他公关媒介类职位,320700; 175 | 320800,会议/会展/活动,320000; 176 | 320801,会议/会展/活动策划,320800; 177 | 320802,会议/会展/活动执行,320800; 178 | 320803,会议/会展/活动经理,320800; 179 | 320804,会议/会展/活动总监,320800; 180 | 320805,其他活动类职位,320800; 181 | 330000,设计/广告/媒体/艺术,0; 182 | 330100,创意/策划/设计,330000; 183 | 330101,创意/策划/文案,330100; 184 | 330102,创意总监/创意经理,330100; 185 | 330103,策划总监/策划经理,330100; 186 | 330104,广告设计,330100; 187 | 330105,UI设计,330100; 188 | 330106,形象/造型/视觉设计,330100; 189 | 330107,平面设计/2D设计,330100; 190 | 330108,三维设计/3D设计,330100; 191 | 330109,插画/手绘/原画,330100; 192 | 330110,数字媒体艺术/多媒体制作,330100; 193 | 330111,展会/活动/舞美设计,330100; 194 | 330112,橱窗/展柜/陈列设计,330100; 195 | 330113,包装设计,330100; 196 | 330114,设计总监/经理/美术指导,330100; 197 | 330115,其他创意设计类职位,330100; 198 | 330200,广告销售/项目执行,330000; 199 | 330201,客户执行/AE,330200; 200 | 330202,广告客户总监/客户经理,330200; 201 | 330203,广告项目总监/项目经理,330200; 202 | 330204,广告销售专员/助理,330200; 203 | 330205,广告销售总监/经理,330200; 204 | 330206,其他广告类职位,330200; 205 | 330300,编辑/内容制作/后期,330000; 206 | 330301,编辑/记者/采编,330300; 207 | 330302,文案编辑/产品编辑,330300; 208 | 330303,美术编辑/修图师,330300; 209 | 330304,校对/排版,330300; 210 | 330305,视频/字幕/音频编辑,330300; 211 | 330306,作家/撰稿/写手,330300; 212 | 330307,编剧/文学统筹/影视策划,330300; 213 | 330308,栏目包装/后期制作/特效,330300; 214 | 330309,总编/主编,330300; 215 | 330310,导演/编导,330300; 216 | 330311,制作总监/制作经理,330300; 217 | 330312,其他编辑类职位,330300; 218 | 330400,出版/发行/影视运营,330000; 219 | 330401,出版/版权管理,330400; 220 | 330402,发行专员/助理,330400; 221 | 330403,发行经理/主管,330400; 222 | 330404,艺术/影视项目经理,330400; 223 | 330405,影院营运/放映管理,330400; 224 | 330406,影院经理/店长,330400; 225 | 330407,其他影视营销类职位,330400; 226 | 330500,艺术/表演/经纪,330000; 227 | 330501,艺术总监/艺术指导,330500; 228 | 330502,摄影/摄像/录音,330500; 229 | 330503,播音/主持/配音,330500; 230 | 330504,演艺人员/模特/礼仪,330500; 231 | 330505,演艺经纪人/星探,330500; 232 | 330506,化妆/造型/服装/道具,330500; 233 | 330507,其他演艺类职位,330500; 234 | 340000,教育/培训/翻译/科研,0; 235 | 340100,课程咨询/课程开发,340000; 236 | 340101,课程顾问/课程咨询师,340100; 237 | 340102,课程销售经理/主管,340100; 238 | 340103,招生专员/招生老师,340100; 239 | 340104,招生经理/主管/主任,340100; 240 | 340105,课程开发/培训策划,340100; 241 | 340106,在线教育产品经理,340100; 242 | 340107,培训项目执行/课程运营,340100; 243 | 340108,在线教育技术开发,340100; 244 | 340109,其他教育培训类职位,340100; 245 | 340200,教师/培训师,340000; 246 | 340201,培训师/讲师,340200; 247 | 340202,培训助理/助教,340200; 248 | 340203,班主任/学习管理/教务,340200; 249 | 340204,早教/幼教/学前教育,340200; 250 | 340205,小学教师/小升初辅导,340200; 251 | 340206,初中教师/中考辅导,340200; 252 | 340207,高中教师/高考辅导,340200; 253 | 340208,大学教师/考研辅导,340200; 254 | 340209,特殊教育老师,340200; 255 | 340210,音乐老师/舞蹈老师,340200; 256 | 340211,美术老师/艺术教师,340200; 257 | 340212,体育老师/运动教练,340200; 258 | 340213,校长/院长/园长,340200; 259 | 340214,其他教师类职位,340200; 260 | 340300,翻译/各语种职位,340000; 261 | 340301,翻译/翻译助理,340300; 262 | 340302,翻译经理/主管,340300; 263 | 340303,英语类,340300; 264 | 340304,日语类,340300; 265 | 340305,德语类,340300; 266 | 340306,法语类,340300; 267 | 340307,俄语类,340300; 268 | 340308,意大利语类,340300; 269 | 340309,西班牙语类,340300; 270 | 340310,葡萄牙语类,340300; 271 | 340311,阿拉伯语类,340300; 272 | 340312,韩语/朝鲜语类,340300; 273 | 340313,泰语类,340300; 274 | 340314,粤语及其他方言类,340300; 275 | 340315,其他语种类职位,340300; 276 | 340400,科研/实验室/学术研究,340000; 277 | 340401,课题研究员/实验室人员,340400; 278 | 340402,科研管理人员,340400; 279 | 340403,学术推广/学术代表,340400; 280 | 340404,其他科研类职位,340400; 281 | 350000,财会/银行/金融/保险,0; 282 | 350100,财务管理,350000; 283 | 350101,财务,350100; 284 | 350102,财务助理/财务文员,350100; 285 | 350103,财务经理/财务主管,350100; 286 | 350104,财务总监/首席财务官,350100; 287 | 350105,成本专员/预算专员,350100; 288 | 350106,成本经理/预算经理,350100; 289 | 350107,财务分析师/专员,350100; 290 | 350108,财务分析经理/主管,350100; 291 | 350109,资产管理专员/助理,350100; 292 | 350110,资产管理经理/主管,350100; 293 | 350111,其他财务管理类职位,350100; 294 | 350200,会计/结算/统计,350000; 295 | 350201,会计师/会计,350200; 296 | 350202,会计助理/会计文员,350200; 297 | 350203,会计经理/主管/总账会计,350200; 298 | 350204,结算专员/助理,350200; 299 | 350205,结算经理/主管,350200; 300 | 350206,统计专员/助理,350200; 301 | 350207,统计经理/主管,350200; 302 | 350208,其他会计类职位,350200; 303 | 350300,出纳/收银/资金管理,350000; 304 | 350301,出纳,350300; 305 | 350302,出纳经理/主管,350300; 306 | 350303,收银员,350300; 307 | 350304,收银经理/主管,350300; 308 | 350305,资金专员/助理,350300; 309 | 350306,资金经理/主管,350300; 310 | 350307,其他出纳类职位,350300; 311 | 350400,审计/税务/风险管理,350000; 312 | 350401,审计师/审计专员,350400; 313 | 350402,审计助理,350400; 314 | 350403,审计总监/经理/主管,350400; 315 | 350405,税务师/税务专员,350400; 316 | 350406,税务助理,350400; 317 | 350407,税务经理/主管,350400; 318 | 350408,稽核/合规/风险管理,350400; 319 | 350409,其他财会类职位,350400; 320 | 350500,银行/信贷,350000; 321 | 350501,银行柜员,350500; 322 | 350502,银行客服,350500; 323 | 350503,大堂经理,350500; 324 | 350504,综合业务,350500; 325 | 350505,公司金融业务,350500; 326 | 350506,小微金融业务,350500; 327 | 350507,个人金融业务,350500; 328 | 350508,银行卡/电子银行业务,350500; 329 | 350509,信贷专员/贷款专员,350500; 330 | 350510,信贷经理/贷款经理,350500; 331 | 350511,信审/资信评估,350500; 332 | 350512,催收经理/催收专员,350500; 333 | 350513,行长/银行部门经理,350500; 334 | 350514,其他银行类职位,350500; 335 | 350600,投融资/理财/金融市场,350000; 336 | 350601,投资顾问/理财顾问,350600; 337 | 350602,投资专员/投资助理,350600; 338 | 350603,投资总监/投资经理,350600; 339 | 350604,融资专员/融资助理,350600; 340 | 350605,融资总监/融资经理,350600; 341 | 350606,投资者关系/证券事务代表,350600; 342 | 350607,交易员/操盘手,350600; 343 | 350608,金融/证券经纪人,350600; 344 | 350609,金融/证券分析师,350600; 345 | 350610,基金经理/金融产品经理,350600; 346 | 350611,投行项目专员/助理,350600; 347 | 350612,投行总监/项目经理,350600; 348 | 350613,彩票/收藏/拍卖/典当,350600; 349 | 350614,其他投融资类职位,350600; 350 | 350700,保险,350000; 351 | 350701,保险产品设计/精算,350700; 352 | 350702,柜面客服/内勤/续期续保,350700; 353 | 350703,核保/定损/理赔,350700; 354 | 350704,财务规划师/保险业务员,350700; 355 | 350705,保险业务经理/团队主管,350700; 356 | 350706,其他保险类职位,350700; 357 | 360000,人力/行政/法律/咨询,0; 358 | 360100,人力资源/人才服务,360000; 359 | 360101,人力资源专员/人事助理,360100; 360 | 360102,人力资源经理/人事主管,360100; 361 | 360103,人力资源总监/人事总监,360100; 362 | 360104,招聘专员/助理,360100; 363 | 360105,招聘经理/主管,360100; 364 | 360106,薪酬绩效专员/助理,360100; 365 | 360107,薪酬绩效经理/主管,360100; 366 | 360108,培训专员/助理,360100; 367 | 360109,培训经理/主管,360100; 368 | 360110,企业文化/员工关系,360100; 369 | 360111,人力资源信息管理/eHR,360100; 370 | 360112,猎头服务/人才顾问,360100; 371 | 360113,其他人力资源类职位,360100; 372 | 360200,行政人员,360000; 373 | 360201,行政专员/行政助理,360200; 374 | 360202,秘书/文员/经理助理,360200; 375 | 360203,前台/接待/总机,360200; 376 | 360204,行政总监/行政经理,360200; 377 | 360205,其他行政类职位,360200; 378 | 360300,企业管理,360000; 379 | 360301,管理培训生/储备干部,360300; 380 | 360302,总裁秘书/总经理助理,360300; 381 | 360303,分公司经理/事业部负责人,360300; 382 | 360304,CEO/总经理/总裁/合伙人,360300; 383 | 360305,其他企业管理类职位,360300; 384 | 360400,法律/法务,360000; 385 | 360401,法务专员/法务助理,360400; 386 | 360402,法务总监/经理/主管,360400; 387 | 360403,法律顾问/律师/诉讼,360400; 388 | 360404,律师助理/非诉律师,360400; 389 | 360405,其他法律类职位,360400; 390 | 360500,知识产权,360000; 391 | 360501,知识产权专员/助理,360500; 392 | 360502,知识产权/专利工程师,360500; 393 | 360503,知识产权经理/主管,360500; 394 | 360504,商标顾问/商标代理,360500; 395 | 360505,专利顾问/专利代理,360500; 396 | 360506,其他知识产权类职位,360500; 397 | 360600,咨询/顾问,360000; 398 | 360601,咨询师/顾问,360600; 399 | 360602,咨询经理/顾问经理,360600; 400 | 360603,其他咨询顾问类职位,360600; 401 | 370000,建筑/房地产/物业管理,0; 402 | 370100,建筑/工程设计,370000; 403 | 370101,建筑设计,370100; 404 | 370102,室内设计,370100; 405 | 370103,园艺/园林/景观设计,370100; 406 | 370104,城市规划/设计,370100; 407 | 370105,动力/电气/照明设计,370100; 408 | 370106,空调/暖通设计,370100; 409 | 370107,给排水设计,370100; 410 | 370108,幕墙设计,370100; 411 | 370109,建筑设计总监/经理,370100; 412 | 370110,其他工程设计类职位,370100; 413 | 370200,建设工程,370000; 414 | 370201,总工/建筑工程师,370200; 415 | 370202,工程总监/项目经理,370200; 416 | 370203,工程造价/概预算,370200; 417 | 370204,结构/土木/土建工程师,370200; 418 | 370205,建筑机电工程师,370200; 419 | 370206,给水排水工程师,370200; 420 | 370207,空调/暖通工程师,370200; 421 | 370208,热力/燃气工程师,370200; 422 | 370209,幕墙工程师,370200; 423 | 370210,光源/照明工程师,370200; 424 | 370211,智能楼宇/综合布线,370200; 425 | 370212,装修工程管理,370200; 426 | 370213,市政/道路/桥梁工程,370200; 427 | 370214,交通/隧道/地铁工程,370200; 428 | 370215,线路/管道/设备工程,370200; 429 | 370216,城市绿化工程管理,370200; 430 | 370217,勘察设计/测绘测量,370200; 431 | 370218,工程施工员/安全员,370200; 432 | 370219,资料员/工程助理,370200; 433 | 370220,工程质量管理/验收,370200; 434 | 370221,工程监理/工程咨询,370200; 435 | 370222,其他工程类职位,370200; 436 | 370300,房地产/物业管理,370000; 437 | 370301,房地产开发/策划人员,370300; 438 | 370302,报批/报建人员,370300; 439 | 370303,房地产投资/房地产评估,370300; 440 | 370304,置业顾问/房地产经纪人,370300; 441 | 370305,房地产销售经理/主管,370300; 442 | 370306,物业管理员/接待/客服,370300; 443 | 370307,物业经理/主管,370300; 444 | 370308,其他房地产经营类职位,370300; 445 | 380000,物流/仓储/采购/贸易,0; 446 | 380100,物流管理/运输,380000; 447 | 380101,物流专员/助理,380100; 448 | 380102,物流工程师,380100; 449 | 380103,物流总监/经理/主管,380100; 450 | 380104,快递员/送货员,380100; 451 | 380105,货运代理,380100; 452 | 380106,海运/陆运/空运操作,380100; 453 | 380107,运输经理/主管,380100; 454 | 380108,其他物流类职位,380100; 455 | 380200,仓储/包装,380000; 456 | 380201,仓库管理/调度,380200; 457 | 380202,理货/分拣/包装,380200; 458 | 380203,仓库经理/主管,380200; 459 | 380204,其他仓管类职位,380200; 460 | 380300,贸易/采购,380000; 461 | 380301,外贸/贸易专员/助理,380300; 462 | 380302,跟单员/单证员,380300; 463 | 380303,报关员/报检员,380300; 464 | 380304,外贸/贸易经理/主管,380300; 465 | 380305,采购专员/助理/买手,380300; 466 | 380306,采购总监/采购经理,380300; 467 | 380307,其他贸易类职位,380300; 468 | 390000,生产管理/质量管理,0; 469 | 390100,产品工程/生产管理,390000; 470 | 390101,产品工程师/产品项目管理,390100; 471 | 390102,工业设计师/制图员,390100; 472 | 390103,工艺工程师,390100; 473 | 390104,工业工程师,390100; 474 | 390105,生产计划专员/生产助理,390100; 475 | 390106,生产/制造人员,390100; 476 | 390107,物料管理/物料控制,390100; 477 | 390108,生产主管/拉长/组长/领班,390100; 478 | 390109,厂长/工厂经理/车间主任,390100; 479 | 390110,其他生产管理类职位,390100; 480 | 390200,质量管理,390000; 481 | 390201,质检员/品管员/化验员,390200; 482 | 390202,质量工程师/品质管理师,390200; 483 | 390203,质量总监/品质经理,390200; 484 | 390204,QA/QC/测试/检验,390200; 485 | 390205,QA经理/QC经理,390200; 486 | 390206,计量工程师/技术员,390200; 487 | 390207,供应商质量管理/SQE,390200; 488 | 390208,质量体系/认证工程师,390200; 489 | 390209,技术服务/维修工程师,390200; 490 | 390210,技术服务/维修经理,390200; 491 | 390211,其他质量类职位,390200; 492 | 390300,安全/社会责任,390000; 493 | 390301,EHS工程师/专员,390300; 494 | 390302,EHS经理/主管,390300; 495 | 390303,其他EHS类职位,390300; 496 | 400000,电子/机械/能源/环保,0; 497 | 400100,电子/硬件/电气/智能,400000; 498 | 400101,电子工程师/技术员,400100; 499 | 400102,嵌入式软件工程师,400100; 500 | 400103,硬件开发/电路工程师,400100; 501 | 400104,电池/电源/变压器工程师,400100; 502 | 400105,电器工程师/技术员,400100; 503 | 400106,激光/光电技术,400100; 504 | 400107,电气工程师/技术员,400100; 505 | 400108,现场应用工程师/FAE,400100; 506 | 400109,其他电子电气类职位,400100; 507 | 400200,机械/设备/仪器仪表,400000; 508 | 400201,机械设计/机械工程师,400200; 509 | 400202,机械零部件设计,400200; 510 | 400203,设备工程师/机械维修,400200; 511 | 400204,设备经理/主管,400200; 512 | 400205,仪器仪表/自动化工程师,400200; 513 | 400206,CNC/数控工程师,400200; 514 | 400207,工装/模具工程师,400200; 515 | 400208,装配工程师/技术员,400200; 516 | 400209,包装工程师/技术员,400200; 517 | 400211,其他机械类职位,400200; 518 | 400300,汽车,400000; 519 | 400301,汽车设计,400300; 520 | 400302,汽车工程师,400300; 521 | 400303,汽车销售/经纪人,400300; 522 | 400304,汽车维修/保养/美容,400300; 523 | 400305,4S店经理/维修站经理,400300; 524 | 400306,车险/定损/理赔,400300; 525 | 400307,驾校教练/汽车代驾,400300; 526 | 400308,其他汽车类职位,400300; 527 | 400400,石油/水利/电力/能源工程,400000; 528 | 400401,能源工程师,400400; 529 | 400402,能源项目经理,400400; 530 | 400403,地质勘探/岩土工程,400400; 531 | 400404,煤炭/石油/天然气工程,400400; 532 | 400405,金属矿产开采/冶炼,400400; 533 | 400406,水文/水资源/水利工程,400400; 534 | 400407,电力/火力/核工程,400400; 535 | 400408,太阳能/光伏工程,400400; 536 | 400409,海洋工程,400400; 537 | 400410,新能源研发,400400; 538 | 400411,其他能源类职位,400400; 539 | 400500,环境/环保,400000; 540 | 400501,环保工程师/环评工程师,400500; 541 | 400502,废物处理工程师,400500; 542 | 400503,生态规划/生态治理,400500; 543 | 400504,环境管理/园林景区保护,400500; 544 | 400505,环境项目管理,400500; 545 | 400506,其他环境类职位,400500; 546 | 400600,飞行器/列车/船舶/军工,400000; 547 | 400601,飞行器/列车/船舶/军工设计,400600; 548 | 400602,飞行器/列车/船舶/军工制造,400600; 549 | 400603,其他设备制造类职位,400600; 550 | 410000,制药/医疗器械/化工,0; 551 | 410100,医药/医疗器械研发,410000; 552 | 410101,医药研发人员,410100; 553 | 410102,药物分析/质量检测,410100; 554 | 410103,临床研究/临床协调员,410100; 555 | 410104,医疗器械设研发人员,410100; 556 | 410105,生物工程/生物技术研发,410100; 557 | 410106,注册专员/助理,410100; 558 | 410107,注册经理/主管,410100; 559 | 410108,其他医药研发类职位,410100; 560 | 410200,医药销售/医疗器械销售,410000; 561 | 410201,医药代表/药品推广,410200; 562 | 410202,医药销售总监/经理,410200; 563 | 410203,医疗器械销售代表,410200; 564 | 410204,医疗器械销售总监/经理,410200; 565 | 410205,其他医药销售类职位,410200; 566 | 410300,化工/材料/造纸,410000; 567 | 410301,化工工程师,410300; 568 | 410302,无机化工/无机材料,410300; 569 | 410303,有机化工,410300; 570 | 410304,材料工程师,410300; 571 | 410305,造纸技术/纸品生产,410300; 572 | 410306,化学分析/化工操作,410300; 573 | 410307,其他化工类职位,410300; 574 | 420000,食品/饮料/服装/家居,0; 575 | 420100,食品/饮料,420000; 576 | 420101,食品研发/配方开发,420100; 577 | 420102,食品生产/食品安全,420100; 578 | 420103,饮料/酒品研制/生产,420100; 579 | 420104,食品/饮料销售,420100; 580 | 420105,其他食品类职位,420100; 581 | 420200,纺织/皮革/服装,420000; 582 | 420201,纺织/皮革/服装设计师,420200; 583 | 420202,纺织/皮革/服装加工生产,420200; 584 | 420203,纺织/皮革/服装跟单,420200; 585 | 420204,纺织/皮革/服装质量管理,420200; 586 | 420205,面料开发/面料采购,420200; 587 | 420206,纺织/皮革/服装销售,420200; 588 | 420207,其他纺织类职位,420200; 589 | 420300,家具/家居,420000; 590 | 420301,家具/家居设计师,420300; 591 | 420302,家具/家居用品生产,420300; 592 | 420303,家具/家居用品销售,420300; 593 | 420304,其他家居类职位,420300; 594 | 420400,工艺品/珠宝/其他商品,420000; 595 | 420401,玩具设计/工艺品设计,420400; 596 | 420402,玩具/工艺品生产,420400; 597 | 420403,玩具/工艺品销售,420400; 598 | 420404,珠宝设计/珠宝鉴定师,420400; 599 | 420405,珠宝顾问/珠宝销售,420400; 600 | 420406,其他商品类职位,420400; 601 | 430000,医疗/健康/餐饮/旅游,0; 602 | 430100,医疗/医生,430000; 603 | 430101,在线医生/医疗咨询,430100; 604 | 430102,综合门诊/急诊/全科医生,430100; 605 | 430103,内科医生,430100; 606 | 430104,外科医生,430100; 607 | 430105,妇产科医生,430100; 608 | 430106,儿科医生,430100; 609 | 430107,老年病科医生,430100; 610 | 430108,五官科医生,430100; 611 | 430109,牙医/口腔科医生,430100; 612 | 430110,眼科医生/验光师,430100; 613 | 430111,美容/整形科医生,430100; 614 | 430112,中医科医生,430100; 615 | 430113,神经科医生,430100; 616 | 430114,精神科医生,430100; 617 | 430115,心理医生/心理咨询师,430100; 618 | 430116,医学影像/核医学/放射科医生,430100; 619 | 430117,化验/检验科医生,430100; 620 | 430118,药房管理/药剂师,430100; 621 | 430119,麻醉医生,430100; 622 | 430120,病理科医师,430100; 623 | 430121,肿瘤科医生,430100; 624 | 430122,血库管理/医疗器械管理,430100; 625 | 430123,宠物医生/宠物美容,430100; 626 | 430124,其他医疗类职位,430100; 627 | 430200,护理/健康/运动,430000; 628 | 430201,营养师/健康顾问,430200; 629 | 430202,护士/护理人员,430200; 630 | 430203,理疗/针灸/推拿/运动医学,430200; 631 | 430204,美容顾问/彩妆顾问,430200; 632 | 430205,会籍顾问/健身顾问,430200; 633 | 430206,健身教练/户外领队,430200; 634 | 430207,游泳教练/救生员,430200; 635 | 430208,其他健康类职位,430200; 636 | 430300,酒店/餐饮/商超,430000; 637 | 430301,酒店管理/餐饮管理,430300; 638 | 430302,卖场管理/商超店长,430300; 639 | 430303,楼面管理/大堂经理,430300; 640 | 430304,品牌/连锁招商管理,430300; 641 | 430305,品类管理/采购管理,430300; 642 | 430306,厨师/面点师/食谱开发,430300; 643 | 430307,调酒师/茶艺师/咖啡师,430300; 644 | 430308,店员/营业员/理货/导购,430300; 645 | 430309,收银主管/收银员,430300; 646 | 430310,前台/接待/礼仪/迎宾,430300; 647 | 430311,酒店/餐饮/商超在线客服,430300; 648 | 430312,神秘顾客/试睡员,430300; 649 | 430313,其他零售服务类职位,430300; 650 | 430400,旅行/乘务/航空服务,430000; 651 | 430401,旅游顾问/旅游产品销售,430400; 652 | 430402,导游/讲解员,430400; 653 | 430403,旅游产品/线路策划/计调,430400; 654 | 430404,旅游项目管理/业务管理,430400; 655 | 430405,票务服务/签证服务,430400; 656 | 430406,乘务服务/地勤服务,430400; 657 | 430407,飞行员,430400; 658 | 430408,其他出行服务类职位,430400; 659 | 440000,农林牧渔/公务员/其他,0; 660 | 440100,农/林/牧/渔,440000; 661 | 440101,农林种植/植保/绿化技术,440100; 662 | 440102,农业/林业工程/农林管理,440100; 663 | 440103,动物养殖/兽医/畜牧工程,440100; 664 | 440104,动物营养/饲料研发,440100; 665 | 440105,水产养殖/捕捞/渔业工程,440100; 666 | 440106,其他农林牧渔类职位,440100; 667 | 440200,公务员/社工/其他,440000; 668 | 440201,公务员/行政事业单位人员,440200; 669 | 440202,社会工作/义工/志愿者,440200; 670 | 440203,自由职业者,440200; 671 | 440204,其他职类,440200; -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/HomeActivity.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.mulitmenuselect.demo.dialog.DictUnit; 10 | import com.mulitmenuselect.demo.dialog.ThirdDialog; 11 | 12 | /** 13 | * Created by yuliang.zhao on 2015/3/18. 14 | */ 15 | public class HomeActivity extends Activity { 16 | private static final int REQUEST_CODE = 100; 17 | private TextView tv1,tv2; 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_home); 22 | tv1 = (TextView) findViewById(R.id.textview1); 23 | tv1.setOnClickListener(new View.OnClickListener() { 24 | @Override 25 | public void onClick(View v) { 26 | startActivityForResult(new Intent(HomeActivity.this, MainActivity.class),REQUEST_CODE); 27 | } 28 | }); 29 | tv2 = (TextView) findViewById(R.id.textview2); 30 | tv2.setOnClickListener(new View.OnClickListener() { 31 | @Override 32 | public void onClick(View v) { 33 | ThirdDialog dialog=new ThirdDialog(HomeActivity.this); 34 | dialog.setonItemClickListener(new ThirdDialog.DictItemClickListener() { 35 | @Override 36 | public void onDictItemClick(DictUnit dictUnit) { 37 | if (dictUnit!=null) 38 | tv2.setText(dictUnit.name); 39 | } 40 | }); 41 | dialog.show(); 42 | } 43 | }); 44 | } 45 | 46 | @Override 47 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 48 | super.onActivityResult(requestCode, resultCode, data); 49 | switch (requestCode){ 50 | case REQUEST_CODE: 51 | if (data !=null){ 52 | DictUnit dictUnit= (DictUnit) data.getSerializableExtra("dict"); 53 | if (dictUnit!=null) 54 | tv1.setText(dictUnit.name); 55 | } 56 | break; 57 | default: 58 | 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.support.v7.app.ActionBarActivity; 7 | import android.view.LayoutInflater; 8 | import android.view.Menu; 9 | import android.view.MenuItem; 10 | import android.view.View; 11 | import android.widget.AdapterView; 12 | import android.widget.ListView; 13 | import android.widget.Toast; 14 | 15 | import com.mulitmenuselect.demo.adapter.DictDialogAdapter; 16 | import com.mulitmenuselect.demo.adapter.MyPagerAdapter; 17 | import com.mulitmenuselect.demo.dialog.DictDataManager; 18 | import com.mulitmenuselect.demo.dialog.DictUnit; 19 | import com.mulitmenuselect.demo.widget.MyViewPager; 20 | 21 | import java.io.Serializable; 22 | import java.util.ArrayList; 23 | import java.util.List; 24 | 25 | 26 | public class MainActivity extends ActionBarActivity { 27 | private Context mContext; 28 | public DictDataManager mDictDataManager = DictDataManager.getInstance(); 29 | private MyViewPager mViewPager; 30 | private View view1,view2,view3; 31 | private ListView mListView1,mListView2,mListView3; 32 | private DictDialogAdapter mListView1Adapter, mListView2Adapter, mListView3Adapter; 33 | private List views = new ArrayList(); 34 | 35 | @Override 36 | protected void onCreate(Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | setContentView(R.layout.activity_main); 39 | mContext = this; 40 | initViews(); 41 | } 42 | 43 | private void initViews() { 44 | mViewPager = (MyViewPager) findViewById(R.id.viewpager); 45 | LayoutInflater inflater = LayoutInflater.from(this); 46 | view1 = inflater.inflate(R.layout.page1, null); 47 | view2 = inflater.inflate(R.layout.page1, null); 48 | view3 = inflater.inflate(R.layout.page1, null); 49 | mListView1 = (ListView) view1.findViewById(R.id.listview1); 50 | mListView2 = (ListView) view2.findViewById(R.id.listview1); 51 | mListView3 = (ListView) view3.findViewById(R.id.listview1); 52 | 53 | List list1=mDictDataManager.getTripleColumnData(this, 0); 54 | mListView1Adapter = new DictDialogAdapter(this, list1); 55 | mListView1Adapter.setSelectedBackground(R.drawable.select_white); 56 | mListView1Adapter.setHasDivider(false); 57 | mListView1Adapter.setNormalBackgroundResource(R.color.dictdialog_bg_gray); 58 | mListView1.setAdapter(mListView1Adapter); 59 | 60 | views.add(view1); 61 | views.add(view2); 62 | mViewPager.setAdapter(new MyPagerAdapter(views)); 63 | 64 | mListView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 65 | @Override 66 | public void onItemClick(AdapterView parent, View view, int position, long id) { 67 | if (mListView1Adapter != null) 68 | mListView1Adapter.setSelectedItem(position); 69 | if (mListView2Adapter != null) 70 | mListView2Adapter.setSelectedItem(-1); 71 | 72 | if (views.contains(view3)) { 73 | views.remove(view3); 74 | mViewPager.getAdapter().notifyDataSetChanged(); 75 | } 76 | DictUnit dictUnit = (DictUnit) parent.getItemAtPosition(position); 77 | if (dictUnit.id == 0) {//不限 78 | if (mListView2Adapter != null) { 79 | mListView2Adapter.setData(new ArrayList()); 80 | mListView2Adapter.notifyDataSetChanged(); 81 | } 82 | 83 | setResultDate(dictUnit); 84 | } else { 85 | List list2 = mDictDataManager.getTripleColumnData(mContext, dictUnit.id); 86 | if (mListView2Adapter == null) { 87 | mListView2Adapter = new DictDialogAdapter(mContext, list2); 88 | mListView2Adapter.setNormalBackgroundResource(R.color.white); 89 | mListView2.setAdapter(mListView2Adapter); 90 | } else { 91 | mListView2Adapter.setData(list2); 92 | mListView2Adapter.notifyDataSetChanged(); 93 | } 94 | 95 | 96 | // mRootView.invalidate(); 97 | } 98 | 99 | } 100 | }); 101 | mListView2.setOnItemClickListener(new AdapterView.OnItemClickListener() { 102 | @Override 103 | public void onItemClick(AdapterView parent, final View view, int position, long id) { 104 | if (mListView2Adapter != null) { 105 | mListView2Adapter.setSelectedItem(position); 106 | mListView2Adapter.setSelectedBackground(R.drawable.select_gray); 107 | } 108 | 109 | if (views.contains(view3)) { 110 | views.remove(view3); 111 | } 112 | 113 | DictUnit dictUnit = (DictUnit) parent.getItemAtPosition(position); 114 | List list3 = mDictDataManager.getTripleColumnData(mContext, dictUnit.id); 115 | if (mListView3Adapter == null) { 116 | mListView3Adapter = new DictDialogAdapter(mContext, list3); 117 | mListView3Adapter.setHasDivider(false); 118 | mListView3Adapter.setNormalBackgroundResource(R.color.dictdialog_bg_gray); 119 | mListView3.setAdapter(mListView3Adapter); 120 | } else { 121 | mListView3Adapter.setData(list3); 122 | mListView3Adapter.notifyDataSetChanged(); 123 | } 124 | 125 | views.add(view3); 126 | mViewPager.getAdapter().notifyDataSetChanged(); 127 | mViewPager.postDelayed(new Runnable() { 128 | @Override 129 | public void run() { 130 | mViewPager.setCurrentItem(views.size()-1); 131 | } 132 | }, 300); 133 | } 134 | }); 135 | mListView3.setOnItemClickListener(new AdapterView.OnItemClickListener() { 136 | @Override 137 | public void onItemClick(AdapterView parent, View view, int position, long id) { 138 | DictUnit dictUnit = (DictUnit) parent.getItemAtPosition(position); 139 | setResultDate(dictUnit); 140 | } 141 | }); 142 | } 143 | 144 | private void setResultDate(DictUnit dictUnit){ 145 | Intent intent=new Intent(); 146 | intent.putExtra("dict",(Serializable)dictUnit); 147 | setResult(0, intent); 148 | finish(); 149 | } 150 | @Override 151 | public boolean onCreateOptionsMenu(Menu menu) { 152 | // Inflate the menu; this adds items to the action bar if it is present. 153 | getMenuInflater().inflate(R.menu.menu_main, menu); 154 | return true; 155 | } 156 | 157 | @Override 158 | public boolean onOptionsItemSelected(MenuItem item) { 159 | // Handle action bar item clicks here. The action bar will 160 | // automatically handle clicks on the Home/Up button, so long 161 | // as you specify a parent activity in AndroidManifest.xml. 162 | int id = item.getItemId(); 163 | 164 | //noinspection SimplifiableIfStatement 165 | if (id == R.id.action_settings) { 166 | Toast.makeText(this,"settings",Toast.LENGTH_LONG).show(); 167 | return true; 168 | } 169 | 170 | return super.onOptionsItemSelected(item); 171 | } 172 | 173 | } 174 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/adapter/DictDialogAdapter.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | import android.widget.LinearLayout; 9 | import android.widget.TextView; 10 | 11 | import com.mulitmenuselect.demo.R; 12 | import com.mulitmenuselect.demo.dialog.DictUnit; 13 | 14 | import java.util.List; 15 | 16 | public class DictDialogAdapter extends BaseAdapter { 17 | 18 | private Context mContext; 19 | private List mData; 20 | private int selectedPos = -1; 21 | private int mSelectedBackgroundResource; 22 | private int mNormalBackgroundResource; 23 | private boolean hasDivider = true; 24 | 25 | 26 | public void setNormalBackgroundResource(int normalBackgroundResource) { 27 | this.mNormalBackgroundResource = normalBackgroundResource; 28 | } 29 | 30 | public void setHasDivider(boolean hasDivider) { 31 | this.hasDivider = hasDivider; 32 | } 33 | 34 | public DictDialogAdapter(Context context, List data) { 35 | this.mContext = context; 36 | mData = data; 37 | } 38 | 39 | public void setSelectedBackground(int res) { 40 | mSelectedBackgroundResource = res; 41 | } 42 | 43 | 44 | public void setSelectedItem(int position) { 45 | selectedPos = position; 46 | notifyDataSetChanged(); 47 | } 48 | 49 | 50 | public void setData(List data) { 51 | mData = data; 52 | notifyDataSetChanged(); 53 | } 54 | 55 | @Override 56 | public int getCount() { 57 | if (mData==null) 58 | return 0; 59 | return mData.size(); 60 | } 61 | 62 | @Override 63 | public Object getItem(int position) { 64 | if (mData==null) 65 | return null; 66 | return mData.get(position); 67 | } 68 | 69 | @Override 70 | public long getItemId(int position) { 71 | return position; 72 | } 73 | 74 | @Override 75 | public View getView(int position, View convertView, ViewGroup parent) { 76 | if (convertView == null) { 77 | convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_dict_item, parent, false); 78 | 79 | } 80 | 81 | LinearLayout itemLayout= ViewHolder.get(convertView, R.id.dict_item_ly); 82 | 83 | TextView nameText = ViewHolder.get(convertView, R.id.dict_item_textview); 84 | 85 | TextView dividerTextView = ViewHolder.get(convertView, R.id.dict_item_divider); 86 | 87 | final DictUnit dictUnit = mData.get(position); 88 | 89 | nameText.setText(dictUnit.name); 90 | 91 | 92 | convertView.setSelected(selectedPos == position); 93 | nameText.setSelected(selectedPos == position); 94 | 95 | nameText.setTextColor(selectedPos == position ? 0xFF00B4C9 : 0xFF333333); 96 | 97 | if (mNormalBackgroundResource == 0) 98 | mNormalBackgroundResource = R.color.white; 99 | 100 | if (mSelectedBackgroundResource != 0) 101 | itemLayout.setBackgroundResource(selectedPos == position ? mSelectedBackgroundResource : mNormalBackgroundResource); 102 | 103 | dividerTextView.setVisibility(hasDivider ? View.VISIBLE : View.INVISIBLE); 104 | 105 | return convertView; 106 | } 107 | 108 | 109 | 110 | } 111 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/adapter/MyPagerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.adapter; 2 | 3 | import android.support.v4.view.PagerAdapter; 4 | import android.util.Log; 5 | import android.view.View; 6 | 7 | import com.mulitmenuselect.demo.widget.MyViewPager; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Created by yuliang.zhao on 2015/3/18. 13 | */ 14 | public class MyPagerAdapter extends PagerAdapter { 15 | private List viewList; 16 | 17 | public MyPagerAdapter(List viewList) { 18 | this.viewList = viewList; 19 | } 20 | 21 | @Override 22 | public int getCount() { 23 | // TODO Auto-generated method stub 24 | if (viewList != null) { 25 | return viewList.size(); 26 | } 27 | return 0; 28 | } 29 | 30 | @Override 31 | public boolean isViewFromObject(View arg0, Object arg1) { 32 | // TODO Auto-generated method stub 33 | return (arg0 == arg1); 34 | } 35 | 36 | @Override 37 | public Object instantiateItem(View container, int position) { 38 | // TODO Auto-generated method stub 39 | ((MyViewPager) container).addView(viewList.get(position), 0); 40 | 41 | return viewList.get(position); 42 | } 43 | 44 | @Override 45 | public void destroyItem(View container, int position, Object object) { 46 | // TODO Auto-generated method stub 47 | ((MyViewPager) container).removeView(viewList.get(position)); 48 | } 49 | 50 | @Override 51 | public float getPageWidth(int position) { 52 | Log.d("d","pagewidth = "+super.getPageWidth(position)); 53 | return 0.5f; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/adapter/ViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.adapter; 2 | 3 | import android.util.SparseArray; 4 | import android.view.View; 5 | 6 | public class ViewHolder { 7 | 8 | 9 | private ViewHolder(){} 10 | public static T get(View view, int id) { 11 | SparseArray viewHolder = (SparseArray) view.getTag(); 12 | if (viewHolder == null) { 13 | viewHolder = new SparseArray(); 14 | view.setTag(viewHolder); 15 | } 16 | View childView = viewHolder.get(id); 17 | if (childView == null) { 18 | childView = view.findViewById(id); 19 | viewHolder.put(id, childView); 20 | } 21 | return (T) childView; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/dialog/DictDataManager.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.dialog; 2 | 3 | import android.content.Context; 4 | 5 | import java.util.List; 6 | 7 | public final class DictDataManager { 8 | public enum DictType { 9 | POSITION_FUNCTION("position_function.txt"); 10 | 11 | String fileName; 12 | private DictType(String fileName){ 13 | this.fileName = fileName; 14 | } 15 | public String getFileName(){ 16 | return fileName; 17 | } 18 | } 19 | 20 | private static DictDataManager mInstance; 21 | 22 | private DictDataManager() { 23 | 24 | } 25 | 26 | public static DictDataManager getInstance() { 27 | if (mInstance == null) { 28 | mInstance = new DictDataManager(); 29 | } 30 | return mInstance; 31 | } 32 | 33 | public List getTripleColumnData(Context mContext, int flag){ 34 | return DictUtil.getPositions(mContext, flag, DictType.POSITION_FUNCTION.getFileName()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/dialog/DictUnit.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.dialog; 2 | 3 | import java.io.Serializable; 4 | 5 | public class DictUnit implements Serializable{ 6 | 7 | public int id; 8 | public String name; 9 | public int flag; 10 | 11 | public DictUnit() { 12 | 13 | } 14 | public DictUnit(int id, String name, int flag) { 15 | this.id = id; 16 | this.name = name; 17 | this.flag = flag; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/dialog/DictUtil.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.dialog; 2 | 3 | import android.content.Context; 4 | import android.content.res.AssetManager; 5 | 6 | import com.mulitmenuselect.demo.dialog.DictUnit; 7 | 8 | import java.io.ByteArrayOutputStream; 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.util.ArrayList; 12 | import java.util.HashMap; 13 | import java.util.List; 14 | 15 | public class DictUtil { 16 | public static List city1, city2, city3, industry, position, major, stuMajor, practice_salary2, partTimeJob; 17 | public static HashMap> citys1, citys2, citys3, industrys, positions, 18 | majors, stuMajors, practice_salary2s, partTimeJobs; 19 | 20 | 21 | public static List getPositions(Context context, int flag, String fileName) { 22 | if (position == null) { 23 | initPositions(context, fileName); 24 | } 25 | if (flag == 0) { 26 | return position; 27 | } else { 28 | return positions.get(flag); 29 | } 30 | } 31 | 32 | private static void initPositions(Context context, String fileName) { 33 | String industryString = readAssetsTXT(context, fileName); 34 | String[] strings = industryString.split(";"); 35 | position = new ArrayList(); 36 | positions = new HashMap>(); 37 | for (int i = 0; i < strings.length; i++) { 38 | String[] items = strings[i].split(","); 39 | DictUnit tmp = new DictUnit(); 40 | tmp.id = Integer.parseInt(items[0].trim()); 41 | tmp.name = items[1]; 42 | tmp.flag = Integer.parseInt(items[2].trim()); 43 | if (tmp.flag == 0) { 44 | position.add(tmp); 45 | } else { 46 | if (positions.get(tmp.flag) == null) { 47 | ArrayList temp = new ArrayList(); 48 | temp.add(tmp); 49 | positions.put(tmp.flag, temp); 50 | } else { 51 | positions.get(tmp.flag).add(tmp); 52 | } 53 | } 54 | } 55 | } 56 | 57 | /** 58 | * 读取assets文件夹下的txt字典库文�? 59 | * 60 | * @param context 61 | * 句柄 62 | * @param fName 63 | * 文件�? 64 | * @return 65 | */ 66 | public static String readAssetsTXT(Context context, String fName) { 67 | try { 68 | AssetManager assetManager = context.getAssets(); 69 | InputStream is = assetManager.open(fName); 70 | byte[] bytes = new byte[1024]; 71 | int leng; 72 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 73 | while ((leng = is.read(bytes)) != -1) { 74 | baos.write(bytes, 0, leng); 75 | } 76 | return new String(baos.toByteArray()); 77 | } catch (IOException e) { 78 | e.printStackTrace(); 79 | return null; 80 | } 81 | 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/dialog/MultiDialog.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.dialog; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.view.Gravity; 6 | import android.view.View; 7 | import android.view.Window; 8 | import android.view.WindowManager; 9 | import android.widget.LinearLayout; 10 | import android.widget.TextView; 11 | 12 | import com.mulitmenuselect.demo.R; 13 | 14 | /** 15 | * Created by yuliang.zhao on 2015/3/18. 16 | */ 17 | public class MultiDialog extends Dialog { 18 | 19 | public Context mContext; 20 | public LinearLayout containerViewGroup; 21 | public View mContentView; 22 | public TextView titleView; 23 | Window window = null; 24 | 25 | public MultiDialog(Context context) { 26 | super(context, R.style.dialog_change_card); 27 | mContext = context; 28 | containerViewGroup = (LinearLayout) getLayoutInflater().inflate(R.layout.layout_dictdialog_container, null); 29 | titleView = (TextView) containerViewGroup.findViewById(R.id.dictdialog_title_tv); 30 | } 31 | 32 | public View findViewById(int id) { 33 | return mContentView.findViewById(id); 34 | } 35 | 36 | /** 37 | * 设置窗口显示 38 | */ 39 | public void windowDeploy() { 40 | window = getWindow(); // 得到对话框 41 | window.setWindowAnimations(R.style.RegDialogAnimation); // 设置窗口弹出动画 42 | // window.setBackgroundDrawableResource(R.drawable.bg_picker_view); 43 | WindowManager.LayoutParams wl = window.getAttributes(); 44 | wl.x = 0; // x小于0左移,大于0右移 45 | wl.y = 0; // y小于0上移,大于0下移 46 | // wl.height = 2*DajieApp.mScreenHeight/3; 47 | wl.height = 2 * mContext.getResources().getDisplayMetrics().heightPixels / 3; 48 | wl.width = LinearLayout.LayoutParams.FILL_PARENT; 49 | // wl.alpha = 0.6f; //设置透明度 50 | wl.gravity = Gravity.BOTTOM; // 设置重力 51 | window.setAttributes(wl); 52 | } 53 | 54 | @Override 55 | public void show() { 56 | if (mContentView != null) { 57 | containerViewGroup.addView(mContentView); 58 | } 59 | setContentView(containerViewGroup); 60 | setCanceledOnTouchOutside(true); 61 | windowDeploy(); 62 | super.show(); 63 | } 64 | 65 | @Override 66 | public void setTitle(CharSequence title) { 67 | // TODO Auto-generated method stub 68 | if (titleView != null) 69 | titleView.setText(title); 70 | } 71 | } 72 | 73 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/dialog/ThirdDialog.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.dialog; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.MotionEvent; 6 | import android.view.View; 7 | import android.widget.AdapterView; 8 | import android.widget.LinearLayout; 9 | import android.widget.ListView; 10 | 11 | import com.mulitmenuselect.demo.R; 12 | import com.mulitmenuselect.demo.adapter.DictDialogAdapter; 13 | import com.mulitmenuselect.demo.adapter.MyPagerAdapter; 14 | import com.mulitmenuselect.demo.widget.MyViewPager; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * Created by yuliang.zhao on 2015/3/18. 21 | */ 22 | public class ThirdDialog extends MultiDialog { 23 | private int mWidth; 24 | private MyViewPager mViewPager; 25 | private LinearLayout mRootView; 26 | private View view1,view2,view3; 27 | private ListView mListView1,mListView2,mListView3; 28 | private DictDialogAdapter mListView1Adapter, mListView2Adapter, mListView3Adapter; 29 | private List views = new ArrayList(); 30 | public DictDataManager mDictDataManager = DictDataManager.getInstance(); 31 | private DictItemClickListener mDictItemClickListener; 32 | 33 | public ThirdDialog(Context context) { 34 | super(context); 35 | mWidth = mContext.getResources().getDisplayMetrics().widthPixels; 36 | mContentView = LayoutInflater.from(context).inflate(R.layout.layout_dialog,null); 37 | initViews(); 38 | setTitle("三级列表"); 39 | } 40 | 41 | private void initViews() { 42 | mRootView = (LinearLayout) findViewById(R.id.rootview); 43 | mViewPager = (MyViewPager) findViewById(R.id.viewpager); 44 | mViewPager.setOffscreenPageLimit(2); 45 | LayoutInflater inflater = LayoutInflater.from(mContext); 46 | view1 = inflater.inflate(R.layout.page1, null); 47 | view2 = inflater.inflate(R.layout.page1, null); 48 | view3 = inflater.inflate(R.layout.page1, null); 49 | mListView1 = (ListView) view1.findViewById(R.id.listview1); 50 | mListView2 = (ListView) view2.findViewById(R.id.listview1); 51 | mListView3 = (ListView) view3.findViewById(R.id.listview1); 52 | 53 | List list1=mDictDataManager.getTripleColumnData(mContext, 0); 54 | mListView1Adapter = new DictDialogAdapter(mContext, list1); 55 | mListView1Adapter.setSelectedBackground(R.drawable.select_white); 56 | mListView1Adapter.setHasDivider(false); 57 | mListView1Adapter.setNormalBackgroundResource(R.color.dictdialog_bg_gray); 58 | mListView1.setAdapter(mListView1Adapter); 59 | 60 | views.add(view1); 61 | views.add(view2); 62 | mViewPager.setAdapter(new MyPagerAdapter(views)); 63 | mRootView.setOnTouchListener(new View.OnTouchListener() { 64 | 65 | @Override 66 | public boolean onTouch(View v, MotionEvent event) { 67 | return mViewPager.dispatchTouchEvent(event); 68 | } 69 | }); 70 | 71 | mListView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { 72 | @Override 73 | public void onItemClick(AdapterView parent, View view, int position, long id) { 74 | if (mListView1Adapter != null) 75 | mListView1Adapter.setSelectedItem(position); 76 | if (mListView2Adapter != null) 77 | mListView2Adapter.setSelectedItem(-1); 78 | 79 | if (views.contains(view3)) { 80 | views.remove(view3); 81 | mViewPager.getAdapter().notifyDataSetChanged(); 82 | } 83 | DictUnit dictUnit = (DictUnit) parent.getItemAtPosition(position); 84 | if (dictUnit.id == 0) {//不限 85 | if (mListView2Adapter != null) { 86 | mListView2Adapter.setData(new ArrayList()); 87 | mListView2Adapter.notifyDataSetChanged(); 88 | } 89 | setDictItemClickListener(dictUnit); 90 | } else { 91 | List list2 = mDictDataManager.getTripleColumnData(mContext, dictUnit.id); 92 | if (mListView2Adapter == null) { 93 | mListView2Adapter = new DictDialogAdapter(mContext, list2); 94 | mListView2Adapter.setNormalBackgroundResource(R.color.white); 95 | mListView2.setAdapter(mListView2Adapter); 96 | } else { 97 | mListView2Adapter.setData(list2); 98 | mListView2Adapter.notifyDataSetChanged(); 99 | } 100 | 101 | } 102 | } 103 | }); 104 | mListView2.setOnItemClickListener(new AdapterView.OnItemClickListener() { 105 | @Override 106 | public void onItemClick(AdapterView parent, View view, int position, long id) { 107 | if (mListView2Adapter != null) { 108 | mListView2Adapter.setSelectedItem(position); 109 | mListView2Adapter.setSelectedBackground(R.drawable.select_gray); 110 | } 111 | 112 | if (views.contains(view3)) { 113 | views.remove(view3); 114 | } 115 | 116 | DictUnit dictUnit = (DictUnit) parent.getItemAtPosition(position); 117 | List list3 = mDictDataManager.getTripleColumnData(mContext, dictUnit.id); 118 | if (mListView3Adapter == null) { 119 | mListView3Adapter = new DictDialogAdapter(mContext, list3); 120 | mListView3Adapter.setHasDivider(false); 121 | mListView3Adapter.setNormalBackgroundResource(R.color.dictdialog_bg_gray); 122 | mListView3.setAdapter(mListView3Adapter); 123 | } else { 124 | mListView3Adapter.setData(list3); 125 | mListView3Adapter.notifyDataSetChanged(); 126 | } 127 | 128 | views.add(view3); 129 | mViewPager.getAdapter().notifyDataSetChanged(); 130 | 131 | if (mViewPager.getCurrentItem() != 1) { 132 | mViewPager.postDelayed(new Runnable() { 133 | @Override 134 | public void run() { 135 | mViewPager.setCurrentItem(1); 136 | } 137 | }, 300); 138 | } 139 | } 140 | }); 141 | mListView3.setOnItemClickListener(new AdapterView.OnItemClickListener() { 142 | @Override 143 | public void onItemClick(AdapterView parent, View view, int position, long id) { 144 | DictUnit dictUnit = (DictUnit) parent.getItemAtPosition(position); 145 | setDictItemClickListener(dictUnit); 146 | } 147 | }); 148 | } 149 | 150 | private void setDictItemClickListener(DictUnit dictUnit) { 151 | if (mDictItemClickListener != null) { 152 | mDictItemClickListener.onDictItemClick(dictUnit); 153 | } 154 | dismiss(); 155 | } 156 | 157 | public final void setonItemClickListener(DictItemClickListener listener) { 158 | mDictItemClickListener = listener; 159 | } 160 | 161 | public interface DictItemClickListener { 162 | public void onDictItemClick(DictUnit dictUnit); 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/java/com/mulitmenuselect/demo/widget/MyViewPager.java: -------------------------------------------------------------------------------- 1 | package com.mulitmenuselect.demo.widget; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewPager; 5 | import android.util.AttributeSet; 6 | 7 | /** 8 | * Created by yuliang.zhao on 2015/3/5. 9 | */ 10 | public class MyViewPager extends ViewPager { 11 | 12 | public MyViewPager(Context context) { 13 | super(context); 14 | } 15 | 16 | public MyViewPager(Context context, AttributeSet attrs) { 17 | super(context, attrs); 18 | } 19 | 20 | 21 | 22 | 23 | @Override 24 | public void scrollTo(int x, int y) { 25 | if (getAdapter()==null || x>getWidth()*(getAdapter().getCount()-2)){ 26 | return; 27 | } 28 | super.scrollTo(x, y); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/anim/attention_guide_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/anim/attention_guide_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/drawable-xhdpi/select_gray.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/app/src/main/res/drawable-xhdpi/select_gray.9.png -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/drawable-xhdpi/select_white.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/app/src/main/res/drawable-xhdpi/select_white.9.png -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/app/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/layout/activity_home.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 14 | 15 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/layout/layout_dialog.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/layout/layout_dict_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 19 | 20 | 21 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/layout/layout_dictdialog_container.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 20 | 21 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/layout/page1.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/menu/menu_main.xml: -------------------------------------------------------------------------------- 1 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/values/color.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | #ededed 5 | #e7e7e7 6 | #f5f5f5 7 | 8 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MultiMenuSelectDemo 5 | Hello world! 6 | Open_Demo 7 | Settings 8 | 9 | 10 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 17 | 18 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.0.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true -------------------------------------------------------------------------------- /MultiMenuSelectDemo/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/MultiMenuSelectDemo/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /MultiMenuSelectDemo/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Apr 10 15:27:10 PDT 2013 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip 7 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /MultiMenuSelectDemo/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | MultiMenuSelect 2 | ============= 3 | 4 | 三级或多级选择菜单,支持左右滑动!目前只写了一个三级的demo,不过有了这个实现4级及以上会很容易了 5 | 如图: 6 | 7 | ![image](https://github.com/arlong/MultiMenuSelect/blob/master/image/screenshot.gif) 8 | -------------------------------------------------------------------------------- /image/screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arlong/MultiMenuSelect/7060cd703191b812f2a332a2110207b82f2f6e0d/image/screenshot.gif --------------------------------------------------------------------------------