DropMenuWidget(下拉二级菜单)

本文介绍了如何使用DropMenuWidget创建带有二级列表的下拉菜单。源码分为LibDropMenu(实现下拉菜单)和LibSecondary(实现二级列表)。下拉菜单在关闭后,内容区域包含一个ViewPager。场景适用于需要可滑动内容和下拉菜单的场景。详细使用方法包括XML布局和Java代码示例,并提供了源码分析和GitHub链接。
概述
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上赐教和交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值