美文网首页安卓集中营自定义Android 轮子
自己造轮子--android常用多条件筛选菜单实现思路(类似美团

自己造轮子--android常用多条件筛选菜单实现思路(类似美团

作者: dongjunkun | 来源:发表于2016-01-10 12:18 被阅读26319次

    就在昨天,我的一个项目DropDownMenu被daimajia的干货网站推荐,一天之内有了200多个star,上了github java分类的头条,有些激动(在这个板块关注了一年多,终于能看到自己的项目在上面),也有些惶恐(怕自己水平不够,会误导大家),总而言之还是很高兴的,截了张图片纪念一下,也希望以后大家多多关注支持我创作

    201601071758332.png

    效果还是很赞的,看下动态图


    simple.gif

    这个项目是我在2015年7月份左右写的,时隔半年,终于有人问津,但时隔半年,也感到这个项目有许多的不足之处,怀着激动的心情今天来讲解并完善这个项目。

    选择实现方式

    若是看到第一眼让我做这个效果,我肯定会选择PopuWindow去做,PopuWindow可以实现显示隐藏效果也自带阴影效果,看上去是不错的选择,网上也有类似库DropDownMenu就是利用PopuWindow实现,但事实上在菜单切换的时候会很不流畅(用的不爽),思维局限的时候容易钻死角,尝试过甚至自定义PopuWindow,最后都毫无办法改善那点问题,最后在网上偶遇一个demo使用View的显示隐藏加些动画效果就解决了我的难题,最终我放弃使用PopuWindow,利用最基本的布局实现了这个项目。

    当遇到难题束手无策时,不妨暂且放下,待思路清晰时,或许它根本就不是个问题

    这个项目做了哪些,没做哪些?

    这个项目并没有实现菜单及里面的逻辑,仅仅提供了一套实现菜单的框架,菜单的样式可完全自定义,目的是为了快速集成,又可扩展(实用),在很多时候,选择开源框架我会将扩展性放在首位,不然再好看再炫我都不会轻易使用,当然,既炫又实用的东西我是不会嫌弃的。

    实现思路

    其实这个项目可以直接使用Xml布局实现,结构是这样的


    QQ截图20160110112344.png

    嗯,大概的结构就是这个样子,但使用xml文件有个弊端,tab的个数不可以动态控制,menu也是一样,tab包括menu和之间的切换和动画处理起来都比较麻烦,我才有意将其封装为独立控件,只需在一处集中处理这些麻烦,提供简单易用的api。

    一些改进想法

    • menu之间的切换支持手势
    • menu底部留白
    • tab可滑动
    • 可使用xml文件布局,却不需要处理其他问题
    • 更灵活的api
      新版的DropDownMenu,敬请期待,预览图:


      dropdownmenunew.gif

    github:DropDownMenu

    欢迎star、fork 、issues

    相关文章

      网友评论

      • 当个海贼多好:我也是个小白,不知道从何入手,如果看的的话,可以指教一下吗?我24小时在线
      • 当个海贼多好:大佬大佬,请问我怎样才能做到三级的效果呢,就是省市区,选完最后的区域后在弹回去
      • 寒翎:你好,最近做一个东西用到了你的控件,我想问一下,这里面有没有方法可以动态设置数据源的,下拉菜单里的数据从服务器获取的话,我就得动态加入数据源了。
      • 大批:时隔两年~ 已经有 2857 个 start 了~~ :smiley:
        dongjunkun:已经有3年了:smile: 感谢一直关注
      • 4410cd44d180:大神,请教个问题,点击tab按钮后,能让menu从底部弹出来吗
      • 破音男:怎么让图标贴近文字?
      • 阿川丶:您好,首先感谢你分享的代码,其次就是想请教你个问题,因为需求我想在想捕捉到展开的列表的事件,不知该怎么捕捉
      • 土豆啊你个马铃薯:底部的contentView 能不能替换成listview 啊? 想在底部展示列表数据? 怎么解决 跪求
      • 410680405945:如果listview能复用就更好了,最好在后面可以动态有一个更多筛选的按钮,便于更多筛选条件时候无法展示完全
      • Uncle_Sun:请问,上面的高度是在哪里设置的。
      • 神经病人思路广:你好,我想问一下,顶部tab之间的那个细线如何定制,或者更说如何修改,你现在是填充布局的我的布局需要padding
        神经病人思路广:就是顶部的divideder
      • 4be416c16c45:看了你的东西,很不错,我这边遇到个问题,就是类似美图那样,还有二级菜单,就像你的第一个城市选项,下拉选择北京,北京右边再弹出个列表,里面列出北京市的区这样的。不知道你这个适合么
      • 时光不止我爱她:怎么设置为gridview?
      • afe019859593:你好,我想问下我打开你的demo的时候就发现上面的标题栏直接覆盖了整个屏幕,下拉菜单也没有显示,我修改了高度之后,还是并没有显示出来下拉菜单,请问下这是什么原因
      • 小白是咸鱼QAQ:您好,请问多级列表怎么扩展
        破音男:直接添加一个layout
      • 小白是咸鱼QAQ:您好,请问多级筛选怎么拓展?
      • 從泚暧祢:你这个内容区域只能动态添加吗
      • 诡异的叶子:一开始自己也写了一套筛选界面,用的也是popwindow实现的,后来发现问题多的很。。。正在准备修改,百度到楼主的写法,豁然开朗。。。。偷懒了,期待楼主更新
      • a99ae706a4ff:问下 新版本有没有解决在mDropDownMenu下面放RecyclerView的问题啊
        dongjunkun:@沾满口水的枕头哦1 我可能没理解你说的意思,是说contentView放RecyclerView是吧,这个应该不会有问题,我现在的项目中都是使用的RecyclerView,并不存在问题,注意RecyclerView的版本,item的顶层布局如果设置了match_parent会只显示一条,设置成warp_content就没事了
        a99ae706a4ff:@dongjunkun 嗯 我改成listview就正常啦 得看下为啥了:blush:
        dongjunkun:看下原理,不支持这么用的,DropDownMenu严格来说不算是一种自定义控件,只是一种组合控件:smile:
      • Waverr:博主您好,在我的项目demo中使用DropDownMenu时,碰见了个问题:
        我的布局文件是一个垂直的LinearLayout,<com.yyydjk.library.DropDownMenu/>下面就是一个<android.support.v7.widget.RecyclerView/>,当我点击DropDownMenu中的某一个tab时,下面的RecyclerView列表要么侵占DropDownMenu下拉GridView的一部分空间,要么就是将RecyclerView列表彻底挤出屏幕空间。
        请问,这种情况时,该如何设置contentView的属性或者有什么其它方式能够解决问题,万分感谢!
        Waverr: @LittleWaver 好的,谢谢您的指点!
        dongjunkun:目前不支持这么用吧,DropDownMenu就是一个顶级的容器,recyclerView应该属于contentView里面的,可以看下Demo
      • Waverr:博主,您好。
        我将你的DropDownMenu放入ViewPager的一个fragment页面的顶部,当我使用ViewPager下fragment界面的跳转(懒加载)时,出现错误:
        java.lang.IllegalArgumentException: params not match, tabTexts.size() should be equal popupViews.size()。
        tabText的尺寸应该和popupViews的尺寸一样,是什么意思?
        dongjunkun:@LittleWaver 因为ViewPager切换的时候setDropDownMenu被反复执行了,popupViews的个数与tab不匹配了,解决方式有好几种吧,一种是setDropDownMenu修改源码,清空之前的View(调用removeAllViews),还有一种是实现懒加载,当然也可以通过其他的方式(比如标记法防止setDropDownMenu被反复执行)
        Waverr:@dongjunkun 是ViewPager中fragment切换时,在运行语句dropDownMenu.setDropDownMenu(Arrays.asList(headers), popupViews, contentView)时,报出这个错误的,请问您知道是什么原因吗
        dongjunkun:意思是tab的个数应当和菜单的个数一样,这里的size不应该理解为尺寸
      • from0:我现在的需求点一个按钮在toolbar下面弹出,但是你这个点击事件是封装在内部,还有一个header布局。 我想用我自己的点击事件不要header,是不是只有自己改你的源码了?项目时间有点急,怕来不及
        from0: @dongjunkun 嗯 谢谢你。
        dongjunkun:改源码吧,这个项目我本身不太建议使用Gradle导入的
      • a101bcb6ccce:您好!想问下弹出的菜单,如果数据很多,请问下底部应该怎么设置留白啊?谢谢了!
        dongjunkun:可以参考下这个https://github.com/keyboard3/DropDownMenu
      • GOAD:请问如果我想在选择星座时,我选了金牛座后,不按确定,而是点按遮罩,也想刷新怎么实现呢(只是打个比方)。其实就是我在筛选栏中嵌套一个多选列表,然后关闭menu时刷新数据。
      • 7f5cf3b1e04b:楼主你好 建议改进的时候第一个选项 那就是支持底部弹出菜单
      • 9721d69ade5b:博主我在setDropDownMenu方法中遇到 Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        怎样解决?
        5027b4d7b0b9: @dongjunkun 这个如何解决。😂
        dongjunkun: @dear浩哥哥 用在了viewpager里面?
      • 魔酷粉蓝:楼主,二级筛选怎么做啊,能不能给点提示,或者做个demo啊
        魔酷粉蓝:@dongjunkun @魔酷粉蓝 大神有两个问题请教,第一,点击下拉后原本页面的内容都消失了,这个怎么解决,第二,怎么设置下拉ListView的最大高度,需求迫切,请一定回复,不胜感激
        dongjunkun: @魔酷粉蓝 就2个listview并排就行了,recyclerview也行
      • 4aa1560abab4:我将dropdownmenu的宽和高设置成match_parent,为什么将下面的布局顶出去了???
      • 7bdac540fd9a:楼楼你好,我用了你的demo,但是我在运行的时候,给我报了android.content.res.Resources$NotFoundException: Resource ID #0x0
        这个错误,求助,怎么解决?
      • 3e9a5d9d1ef6:您好 请问一下 我其他边上的妙变线怎么加上啊
      • Jafir:很棒,然后看了一下你的代码,自己也down了。
        提点小建议:
        可以把更多一些方法暴露出来,比如 打开一个tab,openTabAtIndex(int index )
      • keyboard3:我对你的DropDownMenu做了一些扩展 http://www.jianshu.com/p/719267a0df32:smile:
      • 64004063a312:问个问题 , 我有三个tab , 第一个tab不想让他弹出menu , 只响应点击效果 , 请问这个好实现吗
      • 0c0e80f8363e:大神 我用这个报错Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class com.yyydjk.library.DropDownMenu

        Caused by: java.lang.ClassNotFoundException: Didn't find class "com.yyydjk.library.DropDownMenu" on path: DexPathList[[zip file "/data/app/com.jq.lwh-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.jq.lwh-2, /vendor/lib, /system/lib]] 这是什么情况
      • 54443d2f8e0a:大神,如何结合CoordinatorLayout AppBarLayout使用
      • 骑着蚊子去太阳:大侠,我问个问题,对于筛选我想实现“记住”这个功能,那么怎么样能不在“setOnItemClickListener”中"setTabText"来改变每个tab的值呢?不知道我说明白了没有,希望给我个建议,谢谢了。大侠
        骑着蚊子去太阳:@骑着蚊子去太阳 我直接吧xml里面保存的数据取出来,然后这样 mDropDownMenu.setTabText(strcitys);
        mDropDownMenu.setTabText(strages);
        mDropDownMenu.setTabText(strsexs);
        mDropDownMenu.setTabText(strconstellations);这样,不行诶。
      • 捡淑:66666
      • 7c8123b08271:为什么,我下面绑定的内容是pulltorefreshlistview,一开始的listview会只显示一点点啊
      • d248c569352e:http://blog.csdn.net/chenliguan/article/details/51745880 这个应该不是博主吧,被抄了
        d248c569352e:@dongjunkun 唉,版权意识堪忧呢
        dongjunkun: @Metal__ZC 也是无奈啊,之前还被今日头条还有好123文库抄袭过,署名,链接都不留,😂
      • Fritz_Xu:我想请教下在TextView Tab层上面的那一行阴影要怎么去除?
      • 北方南山:请问下,你的那个gif动图页面动态效果是用什么做出来的?
      • hackware:看完gif,确实比较强
      • 尘尘尘尘尘:大神,这个怎么根据第一个菜单选择的内容刷新某个菜单里面的条件呢?
      • ba8194a50d81:大神,这个框架支持二级联动吗?
        dongjunkun:@33号公路 什么样的日历,是DatePicker控件吗
        ba8194a50d81: @dongjunkun 大神,可以知道一下吗??我最近正好用到这个,以前项目里面也是用到这个,自己搞了一个,这次在多条件选择里面又加了日历,不能用了
        dongjunkun: @33号公路 支持的
      • 鸡蛋掉了:新版多久更新呢,新版推荐加上双列表菜单
      • 73757a87a3cb:可以加个时间筛选么
      • e89db09494d2:我喜欢
      • 5215d1801d76:您好,请问一个activity里可以用两个dropdownmeun吗?我需要实现筛选浮动效果,就是在顶部悬浮
      • 好吗好的1111:感谢分享
      • 毒瘤榜首:期待新版本,如果能包含个级联的例子就最好不过了。。。
        烟雨平生_1e03:你做联动了吗
      • 焱轶:加油
      • 8ccc4ea1cc7c:您好,期待您的新版本发布,无意中从百度上找到,非常实用着。 :+1:
      • 6e40af8b4506:很好用
      • 83461ab8a324:151行报资源找不到的错误是怎么回事?
        c3f9677b320c:@dongjunkun 你好,我已经设置了,为什么还是报一样的错,求解求解,谢谢
        dongjunkun:@83461ab8a324 app:ddmenuSelectedIcon="@mipmap/drop_down_selected_icon" //tab选中状态图标
        app:ddmenuUnselectedIcon="@mipmap/drop_down_unselected_icon"//tab未选中状态图标
        这两个属性
        dongjunkun: @83461ab8a324 就是菜单上切换的小图标,库里面没有包含,自己需要设置
      • 83461ab8a324:android.content.res.Resources$NotFoundException: Resource ID #0x0
        at android.content.res.Resources.getValue(Resources.java:1133)
        at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:285)
        at android.support.v7.widget.AppCompatDrawableManager.onDrawableLoadedFromResources(AppCompatDrawableManager.java:389)
        at android.support.v7.widget.TintResources.getDrawable(TintResources.java:48)
        at com.yyydjk.library.DropDownMenu.addTab(DropDownMenu.java:151)
        at com.yyydjk.library.DropDownMenu.setDropDownMenu(DropDownMenu.java:116)
      • 95e97a8fdaa3:很流畅, 我也是用基本布局实现的,效果跟楼主的差不多
        http://blog.csdn.net/u011733020/article/details/51002746
        鸡蛋掉了:@司马觅春春 你的点击打不开了
      • f23bfdd7aa49:出新版本啊
      • 97c2e83985e1:等了好久了 还不出新版本 :sob:
      • 在日留学生:你好,请问如何把已经选择的筛选状态清空到默认情况呢?
        吻中求胜:@Andecy 逻辑问题嘛 Adapter.selectPosition=-1;Adapter.notifyDataSetChanged();
      • 058bcbdb55c4:厉害哦!我在用SwipeToLoadLayout作为contentView的时候,下拉完了popupMenuViews弹不出了,其它简单的组件比如线性布局或者demo里面的textview就没问题。按道理说只是FrameLayout的切换,应该不存在问题哦,求解?
        dongjunkun:@Song6 感谢你的关注,我会抽时间试试你的问题
        058bcbdb55c4:@Song6 该bug已修复。源码中196行popupMenuViews.setVisibility(View.GONE)改为popupMenuViews.setVisibility(View.INVISIBLE),原因不详,估计下拉的时候对poplistview的渲染产生影响。
        058bcbdb55c4:@Song6 我在设置swipeToLoadLayout.setRefreshEnabled(false)取消下拉刷新,就恢复正常了!
      • 97c2e83985e1:大哥 新版什么时候出啊 等不及了
      • 46c99a410eba:很流畅,完全不卡,还一问题怎么通知内容view更新
        46c99a410eba:@dongjunkun の,没有问题,是背景色覆盖了,以为是view不能刷新出来....
        dongjunkun:@lyan321 这个属于逻辑操作啊,比如选择的时候,除了关闭菜单的操作,可刷新内容啊
      • 在日留学生:请问如何实现某一个view的Selected和unselected按钮隐藏呢?比如最后一个(星座)那个是搜索按钮
        dongjunkun:@Andecy 建议你直接copy源码,在添加tab的时候专门对搜索进行判断(在addTab,switchMenu,closeMenu)
      • b885acde512c:非常实用的一个控件。看了实现,思路清晰,写的非常棒。
        dongjunkun:@Aspsine 谬赞了
      • d97bb8c7f85f:我在现在所做的项目中也有用到这种效果,用的activity和fragment之间传值实现,相比来说复杂了很多,期待你的封装好的控件,替换到项目中👍
        f23bfdd7aa49:你是怎么在activity和fragment之间传值的啊@借你吉言
        dongjunkun: @借你吉言 感谢你的支持,这个控件本身就是从实战项目中提炼出来的,可以先用,如果有问题欢迎提出意见或建议,帮助完善,底下提出的想法我实现了一部分,我也是抽时间在整理,也希望你能体谅更新速度慢
      • 7c93775cba9c:不错,FrameLayout
      • 在日留学生:请问新版的什么时候出呀 :joy:

      本文标题:自己造轮子--android常用多条件筛选菜单实现思路(类似美团

      本文链接:https://www.haomeiwen.com/subject/zmobhttx.html