http://www.cnblogs.com/xmcx1995/p/5951686.html
实现效果:
图片素材:
--> 首先, 城市数据字节放在 Json 文件, 就不网络获取了.
city.json 存放 Json 数据:

1 { 2 "result": "0", 3 "message": "接口通信成功!", 4 "responseData": { 5 "History": [], 6 "Recent": [], 7 "Hot": [ 8 { 9 "id": "226", 10 "cityName": "上海" 11 }, 12 { 13 "id": "447", 14 "cityName": "北京" 15 }, 16 { 17 "id": "221", 18 "cityName": "南京" 19 }, 20 { 21 "id": "220", 22 "cityName": "苏州" 23 }, 24 { 25 "id": "261", 26 "cityName": "杭州" 27 }, 28 { 29 "id": "476", 30 "cityName": "天津" 31 } 32 ], 33 "Common": [ 34 { 35 "title": "A", 36 "items": [ 37 { 38 "id": 664, 39 "cityName": "安庆" 40 }, 41 { 42 "id": 3590, 43 "cityName": "安吉县" 44 } 45 ] 46 }, 47 { 48 "title": "B", 49 "items": [ 50 { 51 "id": 3612, 52 "cityName": "巴州" 53 }, 54 { 55 "id": 3366, 56 "cityName": "白银" 57 }, 58 { 59 "id": 910, 60 "cityName": "蚌埠" 61 }, 62 { 63 "id": 2818, 64 "cityName": "保定" 65 }, 66 { 67 "id": 1068, 68 "cityName": "北海" 69 }, 70 { 71 "id": 447, 72 "cityName": "北京" 73 }, 74 { 75 "id": 882, 76 "cityName": "滨州" 77 }, 78 { 79 "id": 2119, 80 "cityName": "亳州" 81 }, 82 { 83 "id": 3449, 84 "cityName": "博尔塔拉蒙古自治州" 85 }, 86 { 87 "id": 2202, 88 "cityName": "滨海县" 89 }, 90 { 91 "id": 2462, 92 "cityName": "滨海新区大港" 93 }, 94 { 95 "id": 2463, 96 "cityName": "滨海新区塘沽" 97 }, 98 { 99 "id": 2464, 100 "cityName": "滨海新区汉沽" 101 }, 102 { 103 "id": 2788, 104 "cityName": "宝应县" 105 }, 106 { 107 "id": 3452, 108 "cityName": "博乐" 109 }, 110 { 111 "id": 3487, 112 "cityName": "霸州" 113 } 114 ] 115 }, 116 { 117 "title": "C", 118 "items": [ 119 { 120 "id": 1889, 121 "cityName": "沧州" 122 }, 123 { 124 "id": 2611, 125 "cityName": "昌吉自治州" 126 }, 127 { 128 "id": 2329, 129 "cityName": "长春" 130 }, 131 { 132 "id": 651, 133 "cityName": "长沙" 134 }, 135 { 136 "id": 2926, 137 "cityName": "长治" 138 }, 139 { 140 "id": 237, 141 "cityName": "常州" 142 }, 143 { 144 "id": 1959, 145 "cityName": "朝阳" 146 }, 147 { 148 "id": 3339, 149 "cityName": "潮州" 150 }, 151 { 152 "id": 279, 153 "cityName": "成都" 154 }, 155 { 156 "id": 3527, 157 "cityName": "承德" 158 }, 159 { 160 "id": 2095, 161 "cityName": "池州" 162 }, 163 { 164 "id": 2303, 165 "cityName": "赤峰" 166 }, 167 { 168 "id": 901, 169 "cityName": "滁州" 170 }, 171 { 172 "id": 621, 173 "cityName": "重庆" 174 }, 175 { 176 "id": 920, 177 "cityName": "崇明县" 178 }, 179 { 180 "id": 2275, 181 "cityName": "曹县" 182 }, 183 { 184 "id": 2620, 185 "cityName": "慈溪" 186 }, 187 { 188 "id": 2709, 189 "cityName": "常熟" 190 }, 191 { 192 "id": 2779, 193 "cityName": "茌平县" 194 }, 195 { 196 "id": 3066, 197 "cityName": "巢湖" 198 }, 199 { 200 "id": 3135, 201 "cityName": "长丰县" 202 }, 203 { 204 "id": 3630, 205 "cityName": "昌黎县" 206 }, 207 { 208 "id": 3640, 209 "cityName": "章丘" 210 }, 211 { 212 "id": 3657, 213 "cityName": "崇州" 214 } 215 ] 216 }, 217 { 218 "title": "D", 219 "items": [ 220 { 221 "id": 3384, 222 "cityName": "达卡(孟加拉国)" 223 }, 224 { 225 "id": 1699, 226 "cityName": "大连" 227 }, 228 { 229 "id": 2700, 230 "cityName": "大庆" 231 }, 232 { 233 "id": 2290, 234 "cityName": "大同" 235 }, 236 { 237 "id": 579, 238 "cityName": "德州" 239 }, 240 { 241 "id": 3351, 242 "cityName": "定州" 243 }, 244 { 245 "id": 254, 246 "cityName": "东莞" 247 }, 248 { 249 "id": 1748, 250 "cityName": "东营" 251 }, 252 { 253 "id": 2208, 254 "cityName": "德清县" 255 }, 256 { 257 "id": 2286, 258 "cityName": "东海县" 259 }, 260 { 261 "id": 2608, 262 "cityName": "定远县" 263 }, 264 { 265 "id": 2715, 266 "cityName": "东台" 267 }, 268 { 269 "id": 3101, 270 "cityName": "砀山县" 271 }, 272 { 273 "id": 3150, 274 "cityName": "大厂县" 275 }, 276 { 277 "id": 3166, 278 "cityName": "东乡县" 279 }, 280 { 281 "id": 3281, 282 "cityName": "丹阳" 283 }, 284 { 285 "id": 3406, 286 "cityName": "东明县" 287 }, 288 { 289 "id": 3618, 290 "cityName": "大悟县" 291 }, 292 { 293 "id": 3643, 294 "cityName": "敦煌" 295 }, 296 { 297 "id": 3661, 298 "cityName": "大名县" 299 } 300 ] 301 }, 302 { 303 "title": "F", 304 "items": [ 305 { 306 "id": 2176, 307 "cityName": "佛山" 308 }, 309 { 310 "id": 801, 311 "cityName": "福州" 312 }, 313 { 314 "id": 3165, 315 "cityName": "抚州" 316 }, 317 { 318 "id": 2881, 319 "cityName": "阜阳" 320 }, 321 { 322 "id": 2262, 323 "cityName": "富锦" 324 }, 325 { 326 "id": 2399, 327 "cityName": "凤阳县" 328 }, 329 { 330 "id": 3157, 331 "cityName": "繁峙县" 332 }, 333 { 334 "id": 3162, 335 "cityName": "丰县" 336 }, 337 { 338 "id": 3297, 339 "cityName": "阜南县" 340 }, 341 { 342 "id": 3441, 343 "cityName": "奉化" 344 }, 345 { 346 "id": 3508, 347 "cityName": "阜宁县" 348 }, 349 { 350 "id": 3509, 351 "cityName": "肥东县" 352 }, 353 { 354 "id": 3541, 355 "cityName": "肥西县" 356 }, 357 { 358 "id": 3544, 359 "cityName": "凤台县" 360 } 361 ] 362 }, 363 { 364 "title": "G", 365 "items": [ 366 { 367 "id": 2976, 368 "cityName": "赣州" 369 }, 370 { 371 "id": 3472, 372 "cityName": "广元" 373 }, 374 { 375 "id": 1969, 376 "cityName": "广州" 377 }, 378 { 379 "id": 709, 380 "cityName": "贵阳" 381 }, 382 { 383 "id": 898, 384 "cityName": "桂林" 385 }, 386 { 387 "id": 2002, 388 "cityName": "高唐县" 389 }, 390 { 391 "id": 2129, 392 "cityName": "灌南县" 393 }, 394 { 395 "id": 2224, 396 "cityName": "固始县" 397 }, 398 { 399 "id": 2518, 400 "cityName": "赣榆县" 401 }, 402 { 403 "id": 2734, 404 "cityName": "高密" 405 }, 406 { 407 "id": 2746, 408 "cityName": "高邮" 409 }, 410 { 411 "id": 2752, 412 "cityName": "灌云县" 413 }, 414 { 415 "id": 2819, 416 "cityName": "高碑店" 417 }, 418 { 419 "id": 3060, 420 "cityName": "古交" 421 }, 422 { 423 "id": 3385, 424 "cityName": "孤山1" 425 }, 426 { 427 "id": 3455, 428 "cityName": "沽源县" 429 }, 430 { 431 "id": 3490, 432 "cityName": "固镇县" 433 }, 434 { 435 "id": 3502, 436 "cityName": "贵溪" 437 }, 438 { 439 "id": 3589, 440 "cityName": "瓜州县" 441 }, 442 { 443 "id": 3614, 444 "cityName": "广德县" 445 }, 446 { 447 "id": 3619, 448 "cityName": "古田县" 449 }, 450 { 451 "id": 3634, 452 "cityName": "格尔木" 453 }, 454 { 455 "id": 3699, 456 "cityName": "高安" 457 } 458 ] 459 }, 460 { 461 "title": "H", 462 "items": [ 463 { 464 "id": 558, 465 "cityName": "哈尔滨" 466 }, 467 { 468 "id": 2104, 469 "cityName": "海口" 470 }, 471 { 472 "id": 3633, 473 "cityName": "海西蒙古族藏族自治州" 474 }, 475 { 476 "id": 2233, 477 "cityName": "邯郸" 478 }, 479 { 480 "id": 3652, 481 "cityName": "韩国首尔" 482 }, 483 { 484 "id": 2845, 485 "cityName": "汉中" 486 }, 487 { 488 "id": 261, 489 "cityName": "杭州" 490 }, 491 { 492 "id": 639, 493 "cityName": "合肥" 494 }, 495 { 496 "id": 895, 497 "cityName": "菏泽" 498 }, 499 { 500 "id": 1074, 501 "cityName": "贺州" 502 }, 503 { 504 "id": 3372, 505 "cityName": "鹤壁" 506 }, 507 { 508 "id": 3611, 509 "cityName": "衡阳" 510 }, 511 { 512 "id": 645, 513 "cityName": "呼和浩特" 514 }, 515 { 516 "id": 2205, 517 "cityName": "湖州" 518 }, 519 { 520 "id": 3397, 521 "cityName": "葫芦岛" 522 }, 523 { 524 "id": 594, 525 "cityName": "淮安" 526 }, 527 { 528 "id": 699, 529 "cityName": "淮北" 530 }, 531 { 532 "id": 1953, 533 "cityName": "淮南" 534 }, 535 { 536 "id": 3124, 537 "cityName": "黄冈" 538 }, 539 { 540 "id": 2451, 541 "cityName": "黄山" 542 }, 543 { 544 "id": 255, 545 "cityName": "惠州" 546 }, 547 { 548 "id": 1774, 549 "cityName": "海安县" 550 }, 551 { 552 "id": 1840, 553 "cityName": "海阳" 554 }, 555 { 556 "id": 2347, 557 "cityName": "海门" 558 }, 559 { 560 "id": 2356, 561 "cityName": "黄骅" 562 }, 563 { 564 "id": 2878, 565 "cityName": "霍山县" 566 }, 567 { 568 "id": 3125, 569 "cityName": "红安县" 570 }, 571 { 572 "id": 3266, 573 "cityName": "洪泽县" 574 }, 575 { 576 "id": 3291, 577 "cityName": "怀来县" 578 }, 579 { 580 "id": 3494, 581 "cityName": "霍邱县" 582 } 583 ] 584 }, 585 { 586 "title": "J", 587 "items": [ 588 { 589 "id": 771, 590 "cityName": "吉林" 591 }, 592 { 593 "id": 470, 594 "cityName": "济南" 595 }, 596 { 597 "id": 996, 598 "cityName": "济宁" 599 }, 600 { 601 "id": 2230, 602 "cityName": "佳木斯" 603 }, 604 { 605 "id": 1536, 606 "cityName": "嘉兴" 607 }, 608 { 609 "id": 1777, 610 "cityName": "嘉峪关" 611 }, 612 { 613 "id": 2242, 614 "cityName": "焦作" 615 }, 616 { 617 "id": 2893, 618 "cityName": "揭阳" 619 }, 620 { 621 "id": 654, 622 "cityName": "金华" 623 }, 624 { 625 "id": 2543, 626 "cityName": "锦州" 627 }, 628 { 629 "id": 2759, 630 "cityName": "晋城" 631 }, 632 { 633 "id": 2316, 634 "cityName": "晋中" 635 }, 636 { 637 "id": 2076, 638 "cityName": "荆门" 639 }, 640 { 641 "id": 2070, 642 "cityName": "景德镇" 643 }, 644 { 645 "id": 702, 646 "cityName": "九江" 647 }, 648 { 649 "id": 1781, 650 "cityName": "酒泉" 651 }, 652 { 653 "id": 1723, 654 "cityName": "蓟县" 655 }, 656 { 657 "id": 2110, 658 "cityName": "巨野县" 659 }, 660 { 661 "id": 2163, 662 "cityName": "金乡县" 663 }, 664 { 665 "id": 2496, 666 "cityName": "靖江" 667 }, 668 { 669 "id": 2584, 670 "cityName": "句容" 671 }, 672 { 673 "id": 2629, 674 "cityName": "江阴" 675 }, 676 { 677 "id": 2656, 678 "cityName": "莒南县" 679 }, 680 { 681 "id": 2791, 682 "cityName": "嘉祥县" 683 }, 684 { 685 "id": 2923, 686 "cityName": "吉木萨尔县" 687 }, 688 { 689 "id": 3000, 690 "cityName": "莒县" 691 }, 692 { 693 "id": 3034, 694 "cityName": "胶州" 695 }, 696 { 697 "id": 3213, 698 "cityName": "金湖县" 699 }, 700 { 701 "id": 3219, 702 "cityName": "建湖县" 703 }, 704 { 705 "id": 3256, 706 "cityName": "鄄城县" 707 }, 708 { 709 "id": 3294, 710 "cityName": "静海县" 711 }, 712 { 713 "id": 3403, 714 "cityName": "金坛" 715 }, 716 { 717 "id": 3428, 718 "cityName": "嘉峪关" 719 }, 720 { 721 "id": 3539, 722 "cityName": "金寨县" 723 }, 724 { 725 "id": 3548, 726 "cityName": "泾县" 727 }, 728 { 729 "id": 3578, 730 "cityName": "绩溪县" 731 }, 732 { 733 "id": 3600, 734 "cityName": "介休" 735 }, 736 { 737 "id": 3677, 738 "cityName": "嘉善县" 739 }, 740 { 741 "id": 3706, 742 "cityName": "吉首" 743 } 744 ] 745 }, 746 { 747 "title": "K", 748 "items": [ 749 { 750 "id": 907, 751 "cityName": "开封" 752 }, 753 { 754 "id": 1833, 755 "cityName": "昆明" 756 }, 757 { 758 "id": 2824, 759 "cityName": "昆山" 760 }, 761 { 762 "id": 3540, 763 "cityName": "康保县" 764 }, 765 { 766 "id": 3613, 767 "cityName": "库尔勒" 768 } 769 ] 770 }, 771 { 772 "title": "L", 773 "items": [ 774 { 775 "id": 3515, 776 "cityName": "来宾" 777 }, 778 { 779 "id": 618, 780 "cityName": "莱芜" 781 }, 782 { 783 "id": 1545, 784 "cityName": "兰州" 785 }, 786 { 787 "id": 993, 788 "cityName": "廊坊" 789 }, 790 { 791 "id": 2623, 792 "cityName": "丽江" 793 }, 794 { 795 "id": 3038, 796 "cityName": "丽水" 797 }, 798 { 799 "id": 762, 800 "cityName": "连云港" 801 }, 802 { 803 "id": 3597, 804 "cityName": "辽源" 805 }, 806 { 807 "id": 1527, 808 "cityName": "聊城" 809 }, 810 { 811 "id": 1008, 812 "cityName": "临沂" 813 }, 814 { 815 "id": 1067, 816 "cityName": "柳州" 817 }, 818 { 819 "id": 2721, 820 "cityName": "六安" 821 }, 822 { 823 "id": 2961, 824 "cityName": "六盘水" 825 }, 826 { 827 "id": 3553, 828 "cityName": "陇南" 829 }, 830 { 831 "id": 3312, 832 "cityName": "吕梁" 833 }, 834 { 835 "id": 267, 836 "cityName": "洛阳" 837 }, 838 { 839 "id": 2417, 840 "cityName": "鹿邑县" 841 }, 842 { 843 "id": 2531, 844 "cityName": "洛川县" 845 }, 846 { 847 "id": 2637, 848 "cityName": "庐江县" 849 }, 850 { 851 "id": 2694, 852 "cityName": "溧阳" 853 }, 854 { 855 "id": 2712, 856 "cityName": "涟水县" 857 }, 858 { 859 "id": 2902, 860 "cityName": "乐亭县" 861 }, 862 { 863 "id": 3120, 864 "cityName": "临朐县" 865 }, 866 { 867 "id": 3202, 868 "cityName": "兰陵县" 869 }, 870 { 871 "id": 3324, 872 "cityName": "临海" 873 }, 874 { 875 "id": 3409, 876 "cityName": "莱阳" 877 }, 878 { 879 "id": 3431, 880 "cityName": "龙口" 881 }, 882 { 883 "id": 3446, 884 "cityName": "林西县" 885 }, 886 { 887 "id": 3517, 888 "cityName": "郎溪县" 889 }, 890 { 891 "id": 3549, 892 "cityName": "利辛县" 893 }, 894 { 895 "id": 3579, 896 "cityName": "临桂县" 897 }, 898 { 899 "id": 3582, 900 "cityName": "灵璧县" 901 }, 902 { 903 "id": 3656, 904 "cityName": "滦平县" 905 }, 906 { 907 "id": 3676, 908 "cityName": "临清" 909 } 910 ] 911 }, 912 { 913 "title": "M", 914 "items": [ 915 { 916 "id": 271, 917 "cityName": "马鞍山" 918 }, 919 { 920 "id": 3333, 921 "cityName": "梅州" 922 }, 923 { 924 "id": 3673, 925 "cityName": "美国凤凰城" 926 }, 927 { 928 "id": 2402, 929 "cityName": "密云县" 930 }, 931 { 932 "id": 3390, 933 "cityName": "蒙城县" 934 }, 935 { 936 "id": 3492, 937 "cityName": "明光" 938 }, 939 { 940 "id": 3675, 941 "cityName": "美国凤凰城" 942 } 943 ] 944 }, 945 { 946 "title": "N", 947 "items": [ 948 { 949 "id": 276, 950 "cityName": "南昌" 951 }, 952 { 953 "id": 221, 954 "cityName": "南京" 955 }, 956 { 957 "id": 723, 958 "cityName": "南宁" 959 }, 960 { 961 "id": 238, 962 "cityName": "南通" 963 }, 964 { 965 "id": 678, 966 "cityName": "宁波" 967 }, 968 { 969 "id": 1135, 970 "cityName": "宁德" 971 }, 972 { 973 "id": 1826, 974 "cityName": "南昌县" 975 }, 976 { 977 "id": 3682, 978 "cityName": "宁国" 979 } 980 ] 981 }, 982 { 983 "title": "P", 984 "items": [ 985 { 986 "id": 3510, 987 "cityName": "平潭县" 988 }, 989 { 990 "id": 1130, 991 "cityName": "莆田" 992 }, 993 { 994 "id": 750, 995 "cityName": "濮阳" 996 }, 997 { 998 "id": 1839, 999 "cityName": "蓬莱" 1000 }, 1001 { 1002 "id": 2377, 1003 "cityName": "邳州" 1004 }, 1005 { 1006 "id": 2386, 1007 "cityName": "平阴县" 1008 }, 1009 { 1010 "id": 2685, 1011 "cityName": "平遥县" 1012 }, 1013 { 1014 "id": 2962, 1015 "cityName": "盘县" 1016 }, 1017 { 1018 "id": 3284, 1019 "cityName": "普宁" 1020 }, 1021 { 1022 "id": 3542, 1023 "cityName": "沛县" 1024 }, 1025 { 1026 "id": 3655, 1027 "cityName": "郫县" 1028 } 1029 ] 1030 }, 1031 { 1032 "title": "Q", 1033 "items": [ 1034 { 1035 "id": 1070, 1036 "cityName": "钦州" 1037 }, 1038 { 1039 "id": 2211, 1040 "cityName": "秦皇岛" 1041 }, 1042 { 1043 "id": 612, 1044 "cityName": "青岛" 1045 }, 1046 { 1047 "id": 2599, 1048 "cityName": "衢州" 1049 }, 1050 { 1051 "id": 3466, 1052 "cityName": "泉州" 1053 }, 1054 { 1055 "id": 2296, 1056 "cityName": "启东" 1057 }, 1058 { 1059 "id": 2408, 1060 "cityName": "青阳县" 1061 }, 1062 { 1063 "id": 2612, 1064 "cityName": "奇台县" 1065 }, 1066 { 1067 "id": 2861, 1068 "cityName": "青州" 1069 }, 1070 { 1071 "id": 3056, 1072 "cityName": "曲阜" 1073 }, 1074 { 1075 "id": 3069, 1076 "cityName": "迁安" 1077 }, 1078 { 1079 "id": 3488, 1080 "cityName": "齐河县" 1081 }, 1082 { 1083 "id": 3501, 1084 "cityName": "全椒县" 1085 }, 1086 { 1087 "id": 3623, 1088 "cityName": "青铜峡" 1089 }, 1090 { 1091 "id": 3662, 1092 "cityName": "沁阳" 1093 } 1094 ] 1095 }, 1096 { 1097 "title": "R", 1098 "items": [ 1099 { 1100 "id": 934, 1101 "cityName": "日照" 1102 }, 1103 { 1104 "id": 873, 1105 "cityName": "如东县" 1106 }, 1107 { 1108 "id": 2147, 1109 "cityName": "如皋" 1110 }, 1111 { 1112 "id": 2896, 1113 "cityName": "乳山" 1114 }, 1115 { 1116 "id": 3523, 1117 "cityName": "荣成" 1118 } 1119 ] 1120 }, 1121 { 1122 "title": "S", 1123 "items": [ 1124 { 1125 "id": 1131, 1126 "cityName": "三明" 1127 }, 1128 { 1129 "id": 3093, 1130 "cityName": "三亚" 1131 }, 1132 { 1133 "id": 1569, 1134 "cityName": "汕头" 1135 }, 1136 { 1137 "id": 2280, 1138 "cityName": "商丘" 1139 }, 1140 { 1141 "id": 226, 1142 "cityName": "上海" 1143 }, 1144 { 1145 "id": 981, 1146 "cityName": "上饶" 1147 }, 1148 { 1149 "id": 1866, 1150 "cityName": "绍兴" 1151 }, 1152 { 1153 "id": 253, 1154 "cityName": "深圳" 1155 }, 1156 { 1157 "id": 273, 1158 "cityName": "沈阳" 1159 }, 1160 { 1161 "id": 3459, 1162 "cityName": "十堰" 1163 }, 1164 { 1165 "id": 746, 1166 "cityName": "石家庄" 1167 }, 1168 { 1169 "id": 220, 1170 "cityName": "苏州" 1171 }, 1172 { 1173 "id": 732, 1174 "cityName": "宿迁" 1175 }, 1176 { 1177 "id": 1726, 1178 "cityName": "宿州" 1179 }, 1180 { 1181 "id": 2221, 1182 "cityName": "泗阳县" 1183 }, 1184 { 1185 "id": 2335, 1186 "cityName": "濉溪县" 1187 }, 1188 { 1189 "id": 2353, 1190 "cityName": "泗洪县" 1191 }, 1192 { 1193 "id": 2561, 1194 "cityName": "寿光" 1195 }, 1196 { 1197 "id": 2697, 1198 "cityName": "沭阳县" 1199 }, 1200 { 1201 "id": 2722, 1202 "cityName": "寿县" 1203 }, 1204 { 1205 "id": 2749, 1206 "cityName": "射阳县" 1207 }, 1208 { 1209 "id": 2932, 1210 "cityName": "睢宁县" 1211 }, 1212 { 1213 "id": 3039, 1214 "cityName": "遂昌县" 1215 }, 1216 { 1217 "id": 3171, 1218 "cityName": "沙河" 1219 }, 1220 { 1221 "id": 3186, 1222 "cityName": "三河" 1223 }, 1224 { 1225 "id": 3222, 1226 "cityName": "舒城县" 1227 }, 1228 { 1229 "id": 3532, 1230 "cityName": "商城县" 1231 }, 1232 { 1233 "id": 3642, 1234 "cityName": "双流县" 1235 }, 1236 { 1237 "id": 3644, 1238 "cityName": "泗县" 1239 } 1240 ] 1241 }, 1242 { 1243 "title": "T", 1244 "items": [ 1245 { 1246 "id": 600, 1247 "cityName": "台州" 1248 }, 1249 { 1250 "id": 736, 1251 "cityName": "太原" 1252 }, 1253 { 1254 "id": 265, 1255 "cityName": "泰安" 1256 }, 1257 { 1258 "id": 606, 1259 "cityName": "泰州" 1260 }, 1261 { 1262 "id": 684, 1263 "cityName": "唐山" 1264 }, 1265 { 1266 "id": 476, 1267 "cityName": "天津" 1268 }, 1269 { 1270 "id": 1778, 1271 "cityName": "天水" 1272 }, 1273 { 1274 "id": 3318, 1275 "cityName": "通辽" 1276 }, 1277 { 1278 "id": 885, 1279 "cityName": "铜陵" 1280 }, 1281 { 1282 "id": 2982, 1283 "cityName": "吐鲁番地区" 1284 }, 1285 { 1286 "id": 1312, 1287 "cityName": "桐庐县" 1288 }, 1289 { 1290 "id": 1696, 1291 "cityName": "桐乡" 1292 }, 1293 { 1294 "id": 2362, 1295 "cityName": "泰兴" 1296 }, 1297 { 1298 "id": 2659, 1299 "cityName": "太仓" 1300 }, 1301 { 1302 "id": 2718, 1303 "cityName": "天台县" 1304 }, 1305 { 1306 "id": 2785, 1307 "cityName": "滕州" 1308 }, 1309 { 1310 "id": 2983, 1311 "cityName": "吐鲁番" 1312 }, 1313 { 1314 "id": 3132, 1315 "cityName": "太和县" 1316 }, 1317 { 1318 "id": 3495, 1319 "cityName": "太湖县" 1320 }, 1321 { 1322 "id": 3530, 1323 "cityName": "桐城" 1324 } 1325 ] 1326 }, 1327 { 1328 "title": "W", 1329 "items": [ 1330 { 1331 "id": 1563, 1332 "cityName": "威海" 1333 }, 1334 { 1335 "id": 756, 1336 "cityName": "潍坊" 1337 }, 1338 { 1339 "id": 768, 1340 "cityName": "温州" 1341 }, 1342 { 1343 "id": 3300, 1344 "cityName": "乌兰察布" 1345 }, 1346 { 1347 "id": 630, 1348 "cityName": "乌鲁木齐" 1349 }, 1350 { 1351 "id": 222, 1352 "cityName": "无锡" 1353 }, 1354 { 1355 "id": 3259, 1356 "cityName": "吴忠" 1357 }, 1358 { 1359 "id": 1046, 1360 "cityName": "芜湖" 1361 }, 1362 { 1363 "id": 421, 1364 "cityName": "武汉" 1365 }, 1366 { 1367 "id": 1779, 1368 "cityName": "武威" 1369 }, 1370 { 1371 "id": 985, 1372 "cityName": "婺源县" 1373 }, 1374 { 1375 "id": 1051, 1376 "cityName": "芜湖县" 1377 }, 1378 { 1379 "id": 1965, 1380 "cityName": "汶上县" 1381 }, 1382 { 1383 "id": 2914, 1384 "cityName": "五河县" 1385 }, 1386 { 1387 "id": 2967, 1388 "cityName": "蔚县" 1389 }, 1390 { 1391 "id": 3177, 1392 "cityName": "文登" 1393 }, 1394 { 1395 "id": 3313, 1396 "cityName": "文水县" 1397 }, 1398 { 1399 "id": 3357, 1400 "cityName": "文安县" 1401 }, 1402 { 1403 "id": 3360, 1404 "cityName": "涡阳县" 1405 }, 1406 { 1407 "id": 3497, 1408 "cityName": "微山县" 1409 }, 1410 { 1411 "id": 3686, 1412 "cityName": "无为县" 1413 } 1414 ] 1415 }, 1416 { 1417 "title": "X", 1418 "items": [ 1419 { 1420 "id": 719, 1421 "cityName": "西安" 1422 }, 1423 { 1424 "id": 2137, 1425 "cityName": "西宁" 1426 }, 1427 { 1428 "id": 802, 1429 "cityName": "厦门" 1430 }, 1431 { 1432 "id": 3555, 1433 "cityName": "咸阳" 1434 }, 1435 { 1436 "id": 3705, 1437 "cityName": "湘西州" 1438 }, 1439 { 1440 "id": 3462, 1441 "cityName": "孝感" 1442 }, 1443 { 1444 "id": 3156, 1445 "cityName": "忻州" 1446 }, 1447 { 1448 "id": 2506, 1449 "cityName": "新乡" 1450 }, 1451 { 1452 "id": 2189, 1453 "cityName": "新余" 1454 }, 1455 { 1456 "id": 1590, 1457 "cityName": "信阳" 1458 }, 1459 { 1460 "id": 2569, 1461 "cityName": "邢台" 1462 }, 1463 { 1464 "id": 816, 1465 "cityName": "徐州" 1466 }, 1467 { 1468 "id": 3078, 1469 "cityName": "宣城" 1470 }, 1471 { 1472 "id": 1720, 1473 "cityName": "盱眙县" 1474 }, 1475 { 1476 "id": 1869, 1477 "cityName": "新昌县" 1478 }, 1479 { 1480 "id": 1926, 1481 "cityName": "兴化" 1482 }, 1483 { 1484 "id": 2390, 1485 "cityName": "霞浦县" 1486 }, 1487 { 1488 "id": 2580, 1489 "cityName": "响水县" 1490 }, 1491 { 1492 "id": 2650, 1493 "cityName": "新沂" 1494 }, 1495 { 1496 "id": 3253, 1497 "cityName": "萧县" 1498 }, 1499 { 1500 "id": 3398, 1501 "cityName": "兴城" 1502 }, 1503 { 1504 "id": 3489, 1505 "cityName": "象山县" 1506 }, 1507 { 1508 "id": 3512, 1509 "cityName": "仙居县" 1510 }, 1511 { 1512 "id": 3536, 1513 "cityName": "歙县" 1514 } 1515 ] 1516 }, 1517 { 1518 "title": "Y", 1519 "items": [ 1520 { 1521 "id": 753, 1522 "cityName": "烟台" 1523 }, 1524 { 1525 "id": 2527, 1526 "cityName": "延安" 1527 }, 1528 { 1529 "id": 759, 1530 "cityName": "盐城" 1531 }, 1532 { 1533 "id": 239, 1534 "cityName": "扬州" 1535 }, 1536 { 1537 "id": 2521, 1538 "cityName": "阳江" 1539 }, 1540 { 1541 "id": 2768, 1542 "cityName": "阳泉" 1543 }, 1544 { 1545 "id": 2341, 1546 "cityName": "宜昌" 1547 }, 1548 { 1549 "id": 3698, 1550 "cityName": "宜春" 1551 }, 1552 { 1553 "id": 1736, 1554 "cityName": "银川" 1555 }, 1556 { 1557 "id": 2577, 1558 "cityName": "鹰潭" 1559 }, 1560 { 1561 "id": 1073, 1562 "cityName": "玉林" 1563 }, 1564 { 1565 "id": 1210, 1566 "cityName": "岳阳" 1567 }, 1568 { 1569 "id": 1766, 1570 "cityName": "运城" 1571 }, 1572 { 1573 "id": 1912, 1574 "cityName": "玉山县" 1575 }, 1576 { 1577 "id": 2471, 1578 "cityName": "鱼台县" 1579 }, 1580 { 1581 "id": 2553, 1582 "cityName": "仪征" 1583 }, 1584 { 1585 "id": 2647, 1586 "cityName": "永城" 1587 }, 1588 { 1589 "id": 2662, 1590 "cityName": "义乌" 1591 }, 1592 { 1593 "id": 2869, 1594 "cityName": "宜兴" 1595 }, 1596 { 1597 "id": 2917, 1598 "cityName": "余姚" 1599 }, 1600 { 1601 "id": 3110, 1602 "cityName": "扬中" 1603 }, 1604 { 1605 "id": 3216, 1606 "cityName": "沂南县" 1607 }, 1608 { 1609 "id": 3309, 1610 "cityName": "延庆县" 1611 }, 1612 { 1613 "id": 3505, 1614 "cityName": "颍上县" 1615 }, 1616 { 1617 "id": 3519, 1618 "cityName": "阳谷县" 1619 }, 1620 { 1621 "id": 3594, 1622 "cityName": "永康" 1623 }, 1624 { 1625 "id": 3615, 1626 "cityName": "沂水县" 1627 }, 1628 { 1629 "id": 3629, 1630 "cityName": "弋阳县" 1631 }, 1632 { 1633 "id": 3659, 1634 "cityName": "郓城县" 1635 }, 1636 { 1637 "id": 3663, 1638 "cityName": "伊川县" 1639 } 1640 ] 1641 }, 1642 { 1643 "title": "Z", 1644 "items": [ 1645 { 1646 "id": 1854, 1647 "cityName": "枣庄" 1648 }, 1649 { 1650 "id": 1207, 1651 "cityName": "张家界" 1652 }, 1653 { 1654 "id": 953, 1655 "cityName": "张家口" 1656 }, 1657 { 1658 "id": 1792, 1659 "cityName": "张掖" 1660 }, 1661 { 1662 "id": 585, 1663 "cityName": "镇江" 1664 }, 1665 { 1666 "id": 490, 1667 "cityName": "郑州" 1668 }, 1669 { 1670 "id": 706, 1671 "cityName": "中山" 1672 }, 1673 { 1674 "id": 3205, 1675 "cityName": "中卫" 1676 }, 1677 { 1678 "id": 2156, 1679 "cityName": "舟山" 1680 }, 1681 { 1682 "id": 2414, 1683 "cityName": "周口" 1684 }, 1685 { 1686 "id": 2058, 1687 "cityName": "珠海" 1688 }, 1689 { 1690 "id": 826, 1691 "cityName": "淄博" 1692 }, 1693 { 1694 "id": 3468, 1695 "cityName": "自贡" 1696 }, 1697 { 1698 "id": 2420, 1699 "cityName": "张北县" 1700 }, 1701 { 1702 "id": 2691, 1703 "cityName": "诸暨" 1704 }, 1705 { 1706 "id": 2729, 1707 "cityName": "邹城" 1708 }, 1709 { 1710 "id": 2743, 1711 "cityName": "张家港" 1712 }, 1713 { 1714 "id": 3641, 1715 "cityName": "诸城" 1716 } 1717 ] 1718 } 1719 ] 1720 } 1721 }
JsonData.java 序列化 Json 数据: (GsonFormat)

--> 接下来, 先写布局, 可以看到第一张图片, 垂直的四个布局样式一样, 这里准备用组合控件的形式实现.
单条布局 item_linear_layout.xml:

自定义组合控件 DefineLinearLayout.java:

然后在主布局 activity_main.xml 中写首页布局: (圆角)


--> 第三步, 写出城市选择的布局.
首先是右侧城市首字母选择的自定义 View (也可以使用自定义 ListView 实现) SlideBar.java:

然后是城市选择的自定义 ListView (重点) CitySelect.java:

最后是城市选择界面的布局: (EditText的样式, 右侧选择栏的样式, 中间的提示的样式)




--> 最后, Java 代码的实现:
CityActivity.java 实现城市选择功能: (工具类 FirstLetter.java 根据汉字得到首字母并转换大写)


MainAcitivity.java 实现其余功能: (包含一个DataPicker - 外部包:
compile 'com.github.flavienlaurent.datetimepicker:library:0.0.2'
)
1 package com.dragon.android.cityselect; 2 3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Message; 7 import android.support.v7.app.AppCompatActivity; 8 import android.view.View; 9 import android.widget.TextView; 10 11 import com.dragon.android.cityselect.view.DefineLinearLayout; 12 import com.fourmob.datetimepicker.date.DatePickerDialog; 13 import com.sleepbot.datetimepicker.time.RadialPickerLayout; 14 import com.sleepbot.datetimepicker.time.TimePickerDialog; 15 16 import java.util.Calendar; 17 18 public class MainActivity extends AppCompatActivity { 19 20 private DefineLinearLayout dl_city; 21 private DefineLinearLayout dl_key; 22 private DefineLinearLayout dl_time; 23 private DefineLinearLayout dl_day; 24 public static final int REQUEST_CODE = 0x000; 25 26 private int[] imgs = {R.mipmap.img_city, R.mipmap.img_key_words, R.mipmap.imag_time, R.mipmap.img_days}; 27 private String[] titles = {"入住城市", "关键字", "入住时间", "入住天数"}; 28 private DefineLinearLayout[] dlls; 29 30 private Bundle mSaveInstanceState; 31 private Handler handler; 32 33 @Override 34 protected void onCreate(Bundle savedInstanceState) { 35 super.onCreate(savedInstanceState); 36 setContentView(R.layout.activity_main); 37 38 initView(); 39 mSaveInstanceState = savedInstanceState; 40 } 41 42 private void initView() { 43 dl_city = (DefineLinearLayout) findViewById(R.id.dl_city); 44 dl_key = (DefineLinearLayout) findViewById(R.id.dl_key); 45 dl_time = (DefineLinearLayout) findViewById(R.id.dl_time); 46 dl_day = (DefineLinearLayout) findViewById(R.id.dl_day); 47 48 dlls = new DefineLinearLayout[]{dl_city, dl_key, dl_time, dl_day}; 49 for (int i = 0; i < dlls.length; i++) { 50 changeDatas(dlls[i], false, imgs[i], titles[i], titles[i]); 51 } 52 getDataPicker(); 53 } 54 55 // 修改初始数据 56 private void changeDatas(DefineLinearLayout layout, Boolean isChecked, int imgRes, String title, String title_c) { 57 layout.changeData(isChecked, imgRes, title, title_c); 58 } 59 60 private void changeDatas(DefineLinearLayout layout, Boolean isChecked) { 61 layout.changeData(isChecked); 62 } 63 64 private void changeData(DefineLinearLayout layout, String title_c) { 65 layout.changeData(title_c); 66 } 67 68 private DefineLinearLayout lastLayout; 69 70 // 点击事件 71 public void click(View v) { 72 if (lastLayout == null) { 73 lastLayout = (DefineLinearLayout) v; 74 } 75 if (v == lastLayout) { 76 } else { 77 changeDatas(lastLayout, false); 78 } 79 changeDatas((DefineLinearLayout) v, true); 80 lastLayout = (DefineLinearLayout) v; 81 switch (v.getId()) { 82 case R.id.dl_city: 83 // 城市选择 84 startActivityForResult(new Intent(this, CityActivity.class), REQUEST_CODE); 85 break; 86 case R.id.dl_key: 87 break; 88 case R.id.dl_time: 89 new DataPicker().showDataPicker(mSaveInstanceState); 90 isFirstTime = true; // 点击入住时间 91 break; 92 case R.id.dl_day: 93 new DataPicker().showDataPicker(mSaveInstanceState); 94 isFirstTime = false; // 点击入住天数 95 break; 96 } 97 } 98 99 @Override 100 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 101 super.onActivityResult(requestCode, resultCode, data); 102 if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { 103 String city = data.getStringExtra("city"); 104 changeData(dl_city, city); 105 } 106 } 107 108 private void getDataPicker() { 109 handler = new Handler(new Handler.Callback() { 110 @Override 111 public boolean handleMessage(Message msg) { 112 switch (msg.what) { 113 case MSG_WHAT: 114 if (isFirstTime) { 115 ((TextView) dl_time.findViewById(R.id.tv_title_c)).setText(msg.obj.toString()); 116 } else { 117 ((TextView) dl_day.findViewById(R.id.tv_title_c)).setText(msg.obj.toString()); 118 } 119 break; 120 } 121 return false; 122 } 123 }); 124 } 125 126 private boolean isFirstTime = false; // 是否点击入住时间 (否则为 入住天数) 127 private static final int MSG_WHAT = 0x00; 128 129 // DataPicker 130 class DataPicker implements DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener { 131 132 public static final String DATEPICKER_TAG = "datepicker"; 133 public static final String TIMEPICKER_TAG = "timepicker"; 134 private Calendar calendar; 135 private String mData; 136 137 private void showDataPicker(Bundle savedInstanceState) { 138 calendar = Calendar.getInstance(); 139 140 DatePickerDialog datePickerDialog = DatePickerDialog.newInstance(this, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), false); 141 142 datePickerDialog.setVibrate(false); 143 datePickerDialog.setYearRange(1985, 2028); 144 datePickerDialog.setCloseOnSingleTapDay(false); 145 datePickerDialog.show(getSupportFragmentManager(), DATEPICKER_TAG); 146 147 if (savedInstanceState != null) { 148 DatePickerDialog dpd = (DatePickerDialog) getSupportFragmentManager().findFragmentByTag(DATEPICKER_TAG); 149 if (dpd != null) { 150 dpd.setOnDateSetListener(this); 151 } 152 153 TimePickerDialog tpd = (TimePickerDialog) getSupportFragmentManager().findFragmentByTag(TIMEPICKER_TAG); 154 if (tpd != null) { 155 tpd.setOnTimeSetListener(this); 156 } 157 } 158 } 159 160 @Override 161 public void onDateSet(DatePickerDialog datePickerDialog, int year, int month, int day) { 162 // Toast.makeText(MainActivity.this, "new date:" + year + "-" + month + "-" + day, Toast.LENGTH_LONG).show(); 163 // TimePickerDialog timePickerDialog = TimePickerDialog.newInstance(this, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), false, false); 164 // timePickerDialog.setVibrate(false); 165 // timePickerDialog.setCloseOnSingleTapMinute(false); 166 // timePickerDialog.show(getSupportFragmentManager(), TIMEPICKER_TAG); 167 Message msg = Message.obtain(); 168 msg.obj = year + "-" + month + "-" + day; 169 msg.what = MSG_WHAT; 170 handler.sendMessage(msg); 171 } 172 173 @Override 174 public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) { 175 // Toast.makeText(MainActivity.this, "new time:" + hourOfDay + "-" + minute, Toast.LENGTH_LONG).show(); 176 } 177 } 178 }
注意?> 要在 Manifest 中定义键盘覆盖, 否则点击 EditText 会把布局往上推.
1 <activity 2 android:name=".CityActivity" 3 android:windowSoftInputMode="adjustPan|stateHidden" 4 android:configChanges="keyboardHidden|orientation|screenSize" />
程序 Demo: 链接:http://pan.baidu.com/s/1geW38GF 密码:k505