概述
1,使用效果
2,源码结构
3,场景
4,使用方法
5,源码分析
6,github地址
1,使用效果
1)下拉菜单
2)二级列表
3)整合
2,源码结构
app:为示例工程
LibSecondary:实现二级列表
LibDropMenu:实现下拉菜单(通过 TabLayout + PopWindow实现)
3,场景
之前看网络上的,直接嵌入写下拉菜单,其实很完善了;动画效果也很不错,可惜满足不了我的需求,原因只有一个,下拉菜单消失之后的内容是一个ViewPager; 而如果不使用PopWindow实现的下拉菜单,则ViewPager就无法滑动。因此只能定制一个了
而为了满足插拔式的设计理念,就分开写下拉菜单和二级列表;然后,插拔式的插在一起
4,使用方法
1)DropMenu
xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_drop_menu_container" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> </LinearLayout>
Java:
String[] headers = new String[]{"下拉1", "下拉2", "下拉3"}; List<View> containerViewList = new ArrayList<>(); containerViewList.add(addTextView("下拉1")); containerViewList.add(addTextView("下拉2")); containerViewList.add(addTextView("下拉3")); View dropMenuView = new DropMenuWidget().start(getContext(), Arrays.asList(headers), containerViewList); LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.ll_drop_menu_container); linearLayout.addView(dropMenuView);
private View addTextView(String content) { TextView textView = new TextView(getContext()); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); textView.setLayoutParams(layoutParams); textView.setBackgroundResource(android.R.color.white); textView.setText(content); return textView; }
2)Secondary
private SecondaryWidget secondaryWidget;
secondaryWidget = new SecondaryWidget(); View secondaryView = secondaryWidget.start(getContext(), new SecondaryWidget.OnSecondaryCallback() { @Override public void onSecondarySelected(String first, String second) { IApplication.toast("first = " + first + ",second = " + second); } }); LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.secondary_container); linearLayout.addView(secondaryView); initData(); secondaryWidget.setDataMap(provinceMap);
private Map<String, List<String>> provinceMap; private void initData() { provinceMap = new HashMap<>(); provinceMap.put("北京市", Arrays.asList("北京")); provinceMap.put("天津市", Arrays.asList("天津")); provinceMap.put("黑龙江省", Arrays.asList("哈尔滨市", "齐齐哈尔市", "佳木斯市", "鹤岗市", "大庆市", "鸡西市", "双鸭山市", "伊春市", "牡丹江市", "黑河市", "七台河市", "绥化市和大兴安岭地区")); provinceMap.put("河北省", Arrays.asList("石家庄", "唐山", "邯郸", "保定", "沧州", "邢台", "廊坊", "承德", "张家口", "衡水", "秦皇岛")); provinceMap.put("山西省", Arrays.asList("大同", "朔州", "忻州", "太原", "阳泉", "晋中", "吕梁", "长治", "临汾", "晋城", "运城")); provinceMap.put("内蒙古自治区", Arrays.asList("呼和浩特市", "包头市", "乌海市", "赤峰市", "通辽市", "鄂尔多斯市", "呼伦贝尔市", "巴彦淖尔市", "乌兰察布市")); provinceMap.put("吉林省", Arrays.asList("长春市", "吉林市", "四平市", "辽源市", "通化市", "白山市", "白城市", "通化市", "松原市")); provinceMap.put("江西省", Arrays.asList("南昌", "九江", "赣州", "吉安", "萍乡", "鹰潭", "新余", "宜春", "上饶", "景德镇", "抚州")); provinceMap.put("海南省", Arrays.asList("海口市", "三亚市", "万宁市", "琼海市", "文昌市", "儋州市", "东方市", "五指山市.定安县", "乐东县", "澄迈县", "屯昌县", "临高县", "白沙黎族自治县")); provinceMap.put("云南省", Arrays.asList("昆明市", "曲靖市", "玉溪市", "昭通市", "楚雄市", "普洱市", "景洪市", "大理市", "保山市", "丽江市", "临沧市", "宣威市", "个旧市", "文山市", "安宁市", "瑞丽市", "芒市")); provinceMap.put("陕西省", Arrays.asList("铜川市", "宝鸡市", "咸阳市", "渭南市", "汉中市", "安康市", "商洛市", "延安市", "榆林市")); provinceMap.put("青海省", Arrays.asList("格尔木市", "西宁市", "玉树", "果洛", "海东", "海西", "海南", "海北")); }
5,源码分析
1) DropMenu
将:TabLayout和PopWindow联合处理
2)Secondary
两个ListView实现同步
6,github地址
欢迎大家在github上赐教和交流