热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android多条件筛选菜单效果

http:blog.csdn.netu011733020articledetails51002746简介多条件筛选菜单,在020app上类似选地区,选择类型等功能。

http://blog.csdn.net/u011733020/article/details/51002746

简介

多条件筛选菜单,在020app 上类似选地区,选择类型等功能。
一般早先来说,都是用popupwindow 去实现这个功能。
但其实原生的布局去实现这样一个功能同样是可以的,并且可以扩展定制样式。
基本所有的菜单,都可以归纳为以上两类:1 Listview(单列) 2 Gridview(多列)


效果

以下两种效果,第一种效果 跟第二种效果,实现方式大同小异。区别仅仅在于ListView 与GridView。

接下来,根据思路去看一下实现过程。

功能介绍:点击顶部的菜单栏,弹出菜单选择栏,选择具体菜单条目后,记录当前选择条目,并关闭菜单选择栏,将该选择条目展示在当前菜单栏上。

思路分析:给顶部的菜单栏添加点击事件,当响应点击事件时,弹出 菜单选择栏,给菜单选择栏的item 记录点击事件,将该item的信息传递出去保存,并改变item选择状态,同事隐藏 菜单选择栏。


  

实现过程:

首先去实现这一个布局

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <RelativeLayout  
  2.         android:id="@+id/rl_option_top"  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="44dp"  
  5.         android:background="@drawable/shape_rectangle_white_bottom_gray" >  
  6.   
  7.         <TextView  
  8.             android:id="@+id/classify"  
  9.             android:layout_width="wrap_content"  
  10.             android:layout_height="fill_parent"  
  11.             android:layout_marginLeft="5dp"  
  12.             android:drawablePadding="2dp"  
  13.             android:drawableRight="@drawable/img_triangle_down_gray"  
  14.             android:gravity="center"  
  15.             android:text="@string/classify" />  
  16.   
  17.         <TextView  
  18.             android:id="@+id/time"  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="fill_parent"  
  21.             android:layout_marginLeft="5dp"  
  22.             android:layout_toRightOf="@id/classify"  
  23.             android:gravity="center"  
  24.             android:text="@string/time" />  
  25.   
  26.         <TextView  
  27.             android:id="@+id/category"  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="fill_parent"  
  30.             android:layout_marginLeft="5dp"  
  31.             android:layout_toRightOf="@id/time"  
  32.             android:gravity="center"  
  33.             android:text="@string/type" />  
  34.   
  35.         <TextView  
  36.             android:id="@+id/rank_xx"  
  37.             android:layout_width="wrap_content"  
  38.             android:layout_height="fill_parent"  
  39.             android:layout_alignParentRight="true"  
  40.             android:layout_centerVertical="true"  
  41.             android:drawableLeft="@drawable/intro_navi_vline"  
  42.             android:gravity="center"  
  43.             android:text="@string/rank_xx" />  
  44.   
  45.         <TextView  
  46.             android:id="@+id/rank_subscribe"  
  47.             android:layout_width="wrap_content"  
  48.             android:layout_height="fill_parent"  
  49.             android:layout_centerVertical="true"  
  50.             android:layout_toLeftOf="@id/rank_xx"  
  51.             android:drawableLeft="@drawable/intro_navi_vline"  
  52.             android:gravity="center"  
  53.             android:text="@string/rank_subscribe" />  
  54.   
  55.         <TextView  
  56.             android:id="@+id/rank_popularity"  
  57.             android:layout_width="wrap_content"  
  58.             android:layout_height="fill_parent"  
  59.             android:layout_centerVertical="true"  
  60.             android:layout_toLeftOf="@id/rank_subscribe"  
  61.             android:gravity="center"  
  62.             android:text="@string/rank_popular" />  
  63.     RelativeLayout>  

接下来是下面的菜单选择栏:


[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout  
  2.         android:id="@+id/ll_menu"  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="200dp"  
  5.         android:layout_below="@+id/rl_option_top"  
  6.         android:background="@color/comm_gray"  
  7.         android:clickable="true"  
  8.         android:orientation="horizontal"  
  9.        >  
  10.   
  11.         <LinearLayout  
  12.             android:id="@+id/layout_two_type"  
  13.             android:layout_width="85dp"  
  14.             android:layout_height="fill_parent"  
  15.             android:orientation="vertical" >  
  16.   
  17.             <TextView  
  18.                 android:id="@+id/txt_classify_group"  
  19.                 android:layout_width="fill_parent"  
  20.                 android:layout_height="43dp"  
  21.                 android:background="@drawable/shape_rectangle_white_bottom_gray"  
  22.                 android:gravity="center"  
  23.                 android:text="@string/rank_chose_class" />  
  24.   
  25.             <TextView  
  26.                 android:id="@+id/txt_time_group"  
  27.                 android:layout_width="fill_parent"  
  28.                 android:layout_height="43dp"  
  29.                 android:background="@drawable/shape_rectangle_white_bottom_gray"  
  30.                 android:gravity="center"  
  31.                 android:text="@string/rank_chose_time" />  
  32.         LinearLayout>  
  33.   
  34.         <ListView  
  35.             android:id="@+id/list_filterc"  
  36.             android:layout_width="match_parent"  
  37.             android:layout_height="wrap_content"  
  38.             android:background="@color/comm_gray" >  
  39.         ListView>  
  40.     LinearLayout>  
由于默认是隐藏的,所以我们记得设置Visible 属性。

接下来就是在Activity去操作了,比较简单,就做了两件事,

1 注册点击事件

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public void onClick(View v) {  
  3.     switch (v.getId()) {  
  4.     case R.id.classify:  
  5.         //点击分类  
  6.         menu.setVisibility(View.VISIBLE);  
  7.         break;  
  8.     case R.id.txt_classify_group:  
  9.         // 选择分类  
  10.         adapter=new FilterAdapter(classArrays,RANKTYPE_CLASSIIFY);  
  11.         list_filter.setAdapter(adapter);  
  12.         adapter.notifyDataSetInvalidated();  
  13.         break;  
  14.     case R.id.txt_time_group:  
  15.         // 选择时间  
  16.         adapter=new FilterAdapter(timeArrays,RANKTYPE_TIME);  
  17.         list_filter.setAdapter(adapter);  
  18.         adapter.notifyDataSetInvalidated();  
  19.         break;  
  20.     default:  
  21.         break;  
  22.     }  
  23.   
  24. }  

 2 给listview 适配数据

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private class FilterAdapter extends BaseAdapter{  
  2.         /** 选择器类型(时间,类型) */  
  3.         public static final String MSG_BUNDLE_KEY_RANKTYPE= "msg_bundle_key_ranktype";  
  4.           
  5.         /** tag_id */  
  6.         public static final String MSG_BUNDLE_KEY_TAGID= "msg_bundle_key_tagid";  
  7.           
  8.         public static final int MSG_WHAT_ONITEM_CLICK= 0x00011;  
  9.         private String[] data;  
  10.         /** 选择器类型(时间,类型) */  
  11.         private int key_ranktype  ;   
  12.   
  13.         public FilterAdapter(String[]  str,int type){  
  14.             super();  
  15.             data=str;  
  16.             key_ranktype=type;  
  17.         }  
  18.         @Override  
  19.         public int getCount() {  
  20.             // TODO Auto-generated method stub  
  21.             return data.length;  
  22.         }  
  23.   
  24.         @Override  
  25.         public Object getItem(int position) {  
  26.             // TODO Auto-generated method stub  
  27.             return data[position];  
  28.         }  
  29.   
  30.         @Override  
  31.         public long getItemId(int position) {  
  32.             // TODO Auto-generated method stub  
  33.             return position;  
  34.         }  
  35.   
  36.         @Override  
  37.         public View getView( int position, View convertView, ViewGroup parent) {  
  38.             cOnvertView=genrateItemLayout();  
  39.             RelativeLayout layout=(RelativeLayout) convertView.findViewById(R.id.id01);  
  40.             final TextView tv=(TextView) convertView.findViewById(R.id.id02);  
  41.             ImageView image=(ImageView) convertView.findViewById(R.id.id03);  
  42.             image.setVisibility(View.GONE);  
  43.             if(time.getText().toString().equals(data[position])){  
  44.                 image.setVisibility(View.VISIBLE);  
  45.             }else if(category.getText().toString().equals(data[position])){  
  46.                 image.setVisibility(View.VISIBLE);  
  47.             }  
  48.             tv.setText(data[position]);  
  49.             layout.setOnClickListener(new OnClickListener() {  
  50.                   
  51.                 @Override  
  52.                 public void onClick(View v) {  
  53.                     Message msg = Message.obtain() ;   
  54.                     msg.what = MSG_WHAT_ONITEM_CLICK ;   
  55.                     Bundle data = new Bundle() ;   
  56.                     data.putString(MSG_BUNDLE_KEY_TAGID, tv.getText().toString()) ;   
  57.                     data.putInt(MSG_BUNDLE_KEY_RANKTYPE, key_ranktype) ;   
  58.                     msg.setData(data) ;   
  59.                     mHandler.sendMessage(msg) ;   
  60.                 }  
  61.             });  
  62.             return convertView;  
  63.         }  

然后在handler 的 handlemessage 方法中去做响应的处理:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // 刷新UI  
  2. private static class MyHandler extends Handler {  
  3.     private final WeakReference mWeakAct;  
  4.   
  5.     public MyHandler(Type01Activity activity) {  
  6.         mWeakAct = new WeakReference(activity);  
  7.     }  
  8.   
  9.     @Override  
  10.     public void handleMessage(android.os.Message msg) {  
  11.         final Type01Activity activity = mWeakAct.get();  
  12.         if (activity == null) {  
  13.             return;  
  14.         }  
  15.         activity.handleMsg(msg);  
  16.     }  
  17. }  
  18.   
  19. public void handleMsg(Message msg) {  
  20.       
  21.     switch (msg.what) {  
  22.     case FilterAdapter.MSG_WHAT_ONITEM_CLICK:  
  23.         String tag_id = msg.getData().getString(FilterAdapter.MSG_BUNDLE_KEY_TAGID) ;   
  24.         int type =  msg.getData().getInt(FilterAdapter.MSG_BUNDLE_KEY_RANKTYPE) ;  
  25.         if(type==RANKTYPE_CLASSIIFY){  
  26.             category.setText(tag_id);  
  27.         }else{  
  28.             time.setText(tag_id);  
  29.         }  
  30.         adapter.notifyDataSetInvalidated();  
  31.         menu.setVisibility(View.GONE);  
  32.     }  
  33.       
  34. }  


第二种效果同理,只要将listview 替换成Gridview,只贴一下布局, Activity中代码基本一致。


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. "1.0" encoding="utf-8"?>  
  2. "http://schemas.android.com/apk/res/android"  
  3.     android:layout_string" >"match_parent"  
  4.     android:layout_string" >"match_parent" >  
  5.   
  6.     
  7.         android:id="@+id/rl_option_top"  
  8.         android:layout_string" >"fill_parent"  
  9.         android:layout_string" >"44dp"  
  10.         android:background="@drawable/shape_rectangle_white_bottom_gray" >  
  11.   
  12.         
  13.             android:id="@+id/classify"  
  14.             android:layout_string" >"wrap_content"  
  15.             android:layout_string" >"fill_parent"  
  16.             android:layout_marginLeft="5dp"  
  17.             android:drawablePadding="2dp"  
  18.             android:drawableRight="@drawable/img_triangle_down_gray"  
  19.             android:gravity="center"  
  20.             android:text="专题分类" />  
  21.       
  22.   
  23.     
  24.         android:visibility="gone"  
  25.         android:id="@+id/layout_grid_filterc"  
  26.         android:layout_string" >"fill_parent"  
  27.         android:layout_string" >"fill_parent"  
  28.         android:layout_below="@id/rl_option_top"  
  29.         android:background="@color/common_half_transparent"  
  30.         android:orientation="horizontal" >  
  31.   
  32.         
  33.             android:id="@+id/grid_filterc"  
  34.             android:layout_string" >"fill_parent"  
  35.             android:layout_string" >"wrap_content"  
  36.             android:background="@color/comm_gray"  
  37.             android:numColumns="@integer/classify_main_filter_header_num" >  
  38.           
  39.       
  40.   
  41.   

下载:

参考: https://github.com/CodingForAndroid/FilterMenu
Demo下载

推荐阅读
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
冒泡鱼的快乐2011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有