├── img ├── device1.png ├── device2.png └── device3.png ├── ic_launcher-web.png ├── libs └── android-support-v4.jar ├── res ├── drawable-hdpi │ └── ic_launcher.png ├── drawable-mdpi │ └── ic_launcher.png ├── drawable-xhdpi │ ├── ic_launcher.png │ ├── arrow_up_shop.png │ ├── tab_bkg_line.9.png │ ├── arrow_down_shop.png │ └── tab_bkg_selected.9.png ├── drawable-xxhdpi │ └── ic_launcher.png ├── drawable │ ├── press.xml │ ├── press2.xml │ └── normal.xml ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ ├── attrs.xml │ └── styles.xml ├── values-sw600dp │ └── dimens.xml ├── menu │ └── main.xml ├── values-sw720dp-land │ └── dimens.xml ├── values-v11 │ └── styles.xml ├── values-v14 │ └── styles.xml └── layout │ ├── filter_menu_listview.xml │ ├── filter_menu_listview_item.xml │ ├── activity_filtermenu_bar.xml │ ├── filter_menu_multichoice_listview_item.xml │ ├── filter_menutwo_listview.xml │ └── activity_main.xml ├── src └── com │ └── filtermenu │ ├── model │ ├── JobType.java │ ├── District.java │ └── City.java │ ├── view │ ├── OnFilterMenusSelectedListener.java │ ├── FilterMenuListener.java │ ├── OnFilterMenuItemClickListener.java │ ├── OnFilterMenuItemSelectListener.java │ ├── FilterMenuListAdapter.java │ ├── FilterMenuList.java │ ├── FilterMenuTwoList.java │ ├── FilterMenuBar.java │ ├── FilterMenu.java │ └── FilterMenuBar2.java │ ├── DataManager.java │ ├── adapter │ ├── DistrictAdapter.java │ ├── PopupAdapter.java │ ├── JobTypeAdapter.java │ ├── CityAdapter.java │ ├── MultiChoiceAdapter.java │ └── MBaseAdapter.java │ ├── FilterMenuBarMainActivity.java │ └── MainActivity.java ├── README.md ├── project.properties ├── proguard-project.txt └── AndroidManifest.xml /img/device1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/img/device1.png -------------------------------------------------------------------------------- /img/device2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/img/device2.png -------------------------------------------------------------------------------- /img/device3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/img/device3.png -------------------------------------------------------------------------------- /ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/ic_launcher-web.png -------------------------------------------------------------------------------- /libs/android-support-v4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/libs/android-support-v4.jar -------------------------------------------------------------------------------- /res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/arrow_up_shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-xhdpi/arrow_up_shop.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/tab_bkg_line.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-xhdpi/tab_bkg_line.9.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/arrow_down_shop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-xhdpi/arrow_down_shop.png -------------------------------------------------------------------------------- /res/drawable-xhdpi/tab_bkg_selected.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhengjun516/FilterMenu/HEAD/res/drawable-xhdpi/tab_bkg_selected.9.png -------------------------------------------------------------------------------- /src/com/filtermenu/model/JobType.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.model; 2 | 3 | public class JobType { 4 | public int id; 5 | public String name; 6 | } 7 | -------------------------------------------------------------------------------- /src/com/filtermenu/model/District.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.model; 2 | 3 | public class District { 4 | 5 | public int id; 6 | public String name; 7 | } 8 | -------------------------------------------------------------------------------- /res/drawable/press.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /res/drawable/press2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #fff 4 | #ff0 5 | #666 6 | -------------------------------------------------------------------------------- /src/com/filtermenu/model/City.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.model; 2 | 3 | import java.util.List; 4 | 5 | public class City { 6 | public int id; 7 | public String name; 8 | 9 | public List districts; 10 | } 11 | -------------------------------------------------------------------------------- /res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16dp 5 | 16dp 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/OnFilterMenusSelectedListener.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | import java.util.Map; 4 | 5 | public interface OnFilterMenusSelectedListener { 6 | public void onFilterMenuSelect(Map filterMenuSelectedValues); 7 | } 8 | -------------------------------------------------------------------------------- /res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FilterMenu 5 | Settings 6 | Hello world! 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/FilterMenuListener.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | /** 3 | * 显隐用到的接口,用于在显示和隐藏的时候处理一些自定义操作 4 | * Created by Chris on 2014/12/11. 5 | */ 6 | public interface FilterMenuListener { 7 | public void onShow(); 8 | public void onHide(); 9 | } 10 | -------------------------------------------------------------------------------- /res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/OnFilterMenuItemClickListener.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | 4 | import android.view.View; 5 | import android.widget.AdapterView; 6 | 7 | public interface OnFilterMenuItemClickListener { 8 | void onItemClick(AdapterView parent, View view, int position, long id); 9 | } 10 | -------------------------------------------------------------------------------- /res/values-sw720dp-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 128dp 8 | 9 | 10 | -------------------------------------------------------------------------------- /res/drawable/normal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/OnFilterMenuItemSelectListener.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | import android.view.View; 4 | import android.view.ViewGroup; 5 | import android.widget.AdapterView; 6 | 7 | public interface OnFilterMenuItemSelectListener { 8 | public void onItemSelect(AdapterView parent,int position, View convertView,View checkBotton); 9 | } 10 | -------------------------------------------------------------------------------- /res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FilterMenu 2 | Android 下拉筛选菜单 3 | 4 | ##功能: 5 | 1,支持下拉单选 6 | 2,支持下拉多选 7 | 3,支持复合单选 8 | 9 | 10 | ##后期规划: 11 | 支持复合多选 12 | 支持自定义界面选择 13 | 14 | 15 | ![image](https://github.com/zhengjun516/FilterMenu/blob/master/img/device1.png) 16 | ![image](https://github.com/zhengjun516/FilterMenu/blob/master/img/device2.png) 17 | ![image](https://github.com/zhengjun516/FilterMenu/blob/master/img/device3.png) 18 | -------------------------------------------------------------------------------- /res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /res/layout/filter_menu_listview.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | -------------------------------------------------------------------------------- /res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /res/layout/filter_menu_listview_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/FilterMenuListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | import java.util.List; 4 | 5 | import com.filtermenu.adapter.MBaseAdapter; 6 | 7 | public class FilterMenuListAdapter { 8 | public static final int SINGLE_COLUMN = 1; 9 | public static final int MULTI_COLUMN = 2; 10 | public int filterMenuType = SINGLE_COLUMN; 11 | 12 | public MBaseAdapter parentAdapter; 13 | public MBaseAdapter childrenAdapter; 14 | 15 | public List getChildren(int position){ 16 | return parentAdapter.getChildren(position); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-19 15 | -------------------------------------------------------------------------------- /res/layout/activity_filtermenu_bar.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 16 | -------------------------------------------------------------------------------- /res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -------------------------------------------------------------------------------- /res/layout/filter_menu_multichoice_listview_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 24 | 25 | -------------------------------------------------------------------------------- /res/layout/filter_menutwo_listview.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 13 | 17 | 22 | -------------------------------------------------------------------------------- /src/com/filtermenu/DataManager.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.filtermenu.model.City; 7 | import com.filtermenu.model.District; 8 | import com.filtermenu.model.JobType; 9 | 10 | public class DataManager { 11 | 12 | 13 | public static List getCities(){ 14 | List cities = new ArrayList(); 15 | for(int i=0;i<20;i++){ 16 | City city = new City(); 17 | city.id = i; 18 | city.name = "城市"+i; 19 | List districts = new ArrayList(); 20 | for(int j=0;j getJobTypes(){ 34 | List jobTypes = new ArrayList(); 35 | for(int i=0;i<20;i++){ 36 | JobType jobType = new JobType(); 37 | jobType.id = i; 38 | jobType.name = "类型"+i; 39 | jobTypes.add(jobType); 40 | } 41 | return jobTypes; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 16 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/FilterMenuList.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.widget.AdapterView; 8 | import android.widget.AdapterView.OnItemClickListener; 9 | import android.widget.BaseAdapter; 10 | import android.widget.LinearLayout; 11 | import android.widget.ListView; 12 | 13 | import com.filtermenu.R; 14 | 15 | /** 16 | * 单列 17 | * @author zhengjun1 18 | */ 19 | public class FilterMenuList extends LinearLayout { 20 | 21 | private ListView listView; 22 | 23 | public FilterMenuList(Context context) { 24 | super(context); 25 | initView(context); 26 | } 27 | 28 | public FilterMenuList(Context context, AttributeSet attrs) { 29 | super(context, attrs); 30 | initView(context); 31 | } 32 | 33 | public FilterMenuList(Context context, AttributeSet attrs, int defStyle) { 34 | super(context, attrs, defStyle); 35 | initView(context); 36 | } 37 | 38 | private void initView(Context context){ 39 | LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 40 | inflater.inflate(R.layout.filter_menu_listview, this, true); 41 | listView = (ListView) findViewById(R.id.lv); 42 | } 43 | 44 | public void setAdapter(BaseAdapter baseAdapter){ 45 | if(listView != null){ 46 | listView.setAdapter(baseAdapter); 47 | } 48 | } 49 | 50 | public void setOnFilterMenuItemClickListener(final OnFilterMenuItemClickListener onItemOnClickListener){ 51 | if(listView != null){ 52 | listView.setOnItemClickListener(new OnItemClickListener() { 53 | @Override 54 | public void onItemClick(AdapterView parent, View view, 55 | int position, long id) { 56 | if(onItemOnClickListener != null){ 57 | onItemOnClickListener.onItemClick(parent, view, position, id); 58 | } 59 | } 60 | }); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 21 | 33 | 45 | 46 | -------------------------------------------------------------------------------- /src/com/filtermenu/adapter/DistrictAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.adapter; 2 | 3 | import java.util.List; 4 | 5 | import android.app.Activity; 6 | import android.view.View; 7 | import android.view.View.OnClickListener; 8 | import android.view.ViewGroup; 9 | import android.widget.LinearLayout; 10 | import android.widget.TextView; 11 | 12 | import com.filtermenu.R; 13 | import com.filtermenu.model.City; 14 | import com.filtermenu.model.District; 15 | 16 | public class DistrictAdapter extends MBaseAdapter { 17 | 18 | public DistrictAdapter(Activity context, List datas,int normalBg, int pressBg) { 19 | super(context, datas); 20 | initParams(normalBg, pressBg); 21 | } 22 | 23 | @Override 24 | public View getView(final int position, View convertView, ViewGroup parent) { 25 | District district = (District) getItem(position); 26 | final View view; 27 | ViewHolder holder; 28 | if(convertView == null) { 29 | view = mInflater.inflate(R.layout.filter_menu_listview_item,null); 30 | holder = new ViewHolder(); 31 | holder.mFilterMenuListItem = (LinearLayout) view.findViewById(R.id.mFilterMenuListItem); 32 | holder.tv = (TextView) view.findViewById(R.id.tv); 33 | view.setTag(holder); 34 | } else { 35 | view = convertView; 36 | holder = (ViewHolder) view.getTag(); 37 | } 38 | holder.tv.setText(district.name); 39 | if(position == selection) { 40 | holder.tv.setBackgroundResource(pressBg); 41 | } else { 42 | holder.tv.setBackgroundResource(normalBg); 43 | } 44 | 45 | holder.mFilterMenuListItem.setOnClickListener(new OnClickListener() { 46 | @Override 47 | public void onClick(View v) { 48 | mOnItemClickListenerAdapterView.onItemClick(view, position, (District) getItem(position)); 49 | } 50 | }); 51 | 52 | return view; 53 | } 54 | 55 | class ViewHolder{ 56 | TextView tv; 57 | LinearLayout mFilterMenuListItem; 58 | } 59 | 60 | @Override 61 | public String getText(int position) { 62 | District district = (District) getItem(position); 63 | return district.name; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/com/filtermenu/adapter/PopupAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.adapter; 2 | 3 | import java.util.List; 4 | 5 | import android.content.Context; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.ViewGroup; 9 | import android.widget.ArrayAdapter; 10 | import android.widget.TextView; 11 | 12 | import com.filtermenu.R; 13 | 14 | /** 15 | * 自定义的弹出框列表适配器,类似于大众点评或美团,如果想要此种效果可以直接使用 16 | * Created by Chris on 2014/12/8. 17 | */ 18 | public class PopupAdapter extends ArrayAdapter { 19 | private int resource; 20 | private int normalBg; 21 | private int pressBg; 22 | private int selection; 23 | 24 | public PopupAdapter(Context context, int resource, String[] objects, int normalBg, int pressBg) { 25 | super(context, resource, objects); 26 | initParams(resource, normalBg, pressBg); 27 | } 28 | 29 | 30 | public PopupAdapter(Context context, int resource, List objects, int normalBg, int pressBg) { 31 | super(context, resource, objects); 32 | initParams(resource, normalBg, pressBg); 33 | } 34 | 35 | private void initParams(int resource, int normalBg, int pressBg){ 36 | this.resource = resource; 37 | this.normalBg = normalBg; 38 | this.pressBg = pressBg; 39 | this.selection = -1; 40 | } 41 | 42 | @Override 43 | public View getView(int position, View convertView, ViewGroup parent) { 44 | String s = getItem(position); 45 | View view; 46 | ViewHolder holder; 47 | if(convertView == null) { 48 | view = LayoutInflater.from(getContext()).inflate(resource,null); 49 | holder = new ViewHolder(); 50 | holder.tv = (TextView) view.findViewById(R.id.tv); 51 | view.setTag(holder); 52 | } else { 53 | view = convertView; 54 | holder = (ViewHolder) view.getTag(); 55 | } 56 | holder.tv.setText(s); 57 | if(position == selection) { 58 | holder.tv.setBackgroundResource(pressBg); 59 | } else { 60 | holder.tv.setBackgroundResource(normalBg); 61 | } 62 | return view; 63 | } 64 | 65 | public void setPressPostion(int position) { 66 | this.selection = position; 67 | } 68 | class ViewHolder{ 69 | TextView tv; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/com/filtermenu/adapter/JobTypeAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.adapter; 2 | 3 | import java.util.List; 4 | 5 | import android.app.Activity; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.view.View.OnClickListener; 9 | import android.view.ViewGroup; 10 | import android.widget.LinearLayout; 11 | import android.widget.TextView; 12 | 13 | import com.filtermenu.R; 14 | import com.filtermenu.adapter.PopupAdapter.ViewHolder; 15 | import com.filtermenu.model.JobType; 16 | 17 | public class JobTypeAdapter extends MBaseAdapter { 18 | 19 | 20 | public JobTypeAdapter(Activity context, List datas,int normalBg, int pressBg) { 21 | super(context, datas); 22 | } 23 | 24 | @Override 25 | public View getView(final int position, View convertView, ViewGroup parent) { 26 | JobType jobType = (JobType) getItem(position); 27 | final View view; 28 | ViewHolder holder; 29 | if(convertView == null) { 30 | view = mInflater.inflate(R.layout.filter_menu_listview_item,null); 31 | holder = new ViewHolder(); 32 | holder.mFilterMenuListItem = (LinearLayout) view.findViewById(R.id.mFilterMenuListItem); 33 | holder.tv = (TextView) view.findViewById(R.id.tv); 34 | view.setTag(holder); 35 | } else { 36 | view = convertView; 37 | holder = (ViewHolder) view.getTag(); 38 | } 39 | holder.tv.setText(jobType.name); 40 | if(position == selection) { 41 | holder.tv.setBackgroundResource(pressBg); 42 | } else { 43 | holder.tv.setBackgroundResource(normalBg); 44 | } 45 | 46 | holder.mFilterMenuListItem.setOnClickListener(new OnClickListener() { 47 | @Override 48 | public void onClick(View v) { 49 | mOnItemClickListenerAdapterView.onItemClick(view, position, (JobType) getItem(position)); 50 | } 51 | }); 52 | 53 | return view; 54 | } 55 | 56 | public void setPressPostion(int position) { 57 | this.selection = position; 58 | } 59 | 60 | class ViewHolder{ 61 | TextView tv; 62 | LinearLayout mFilterMenuListItem; 63 | } 64 | 65 | @Override 66 | public String getText(int position) { 67 | JobType jobType = (JobType) getItem(position); 68 | return jobType.name; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/com/filtermenu/adapter/CityAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.adapter; 2 | 3 | import java.util.List; 4 | 5 | import android.app.Activity; 6 | import android.view.View; 7 | import android.view.View.OnClickListener; 8 | import android.view.ViewGroup; 9 | import android.widget.LinearLayout; 10 | import android.widget.TextView; 11 | 12 | import com.filtermenu.R; 13 | import com.filtermenu.model.City; 14 | import com.filtermenu.model.District; 15 | import com.filtermenu.model.JobType; 16 | 17 | public class CityAdapter extends MBaseAdapter { 18 | 19 | public CityAdapter(Activity context, List datas,int normalBg, int pressBg) { 20 | super(context, datas); 21 | initParams(normalBg, pressBg); 22 | } 23 | 24 | 25 | 26 | 27 | @Override 28 | public List getChildren(int position) { 29 | return datas.get(position).districts; 30 | } 31 | 32 | @Override 33 | public View getView(final int position, View convertView, ViewGroup parent) { 34 | City city = (City) getItem(position); 35 | final View view; 36 | ViewHolder holder; 37 | if(convertView == null) { 38 | view = mInflater.inflate(R.layout.filter_menu_listview_item,null); 39 | holder = new ViewHolder(); 40 | holder.mFilterMenuListItem = (LinearLayout) view.findViewById(R.id.mFilterMenuListItem); 41 | holder.tv = (TextView) view.findViewById(R.id.tv); 42 | view.setTag(holder); 43 | } else { 44 | view = convertView; 45 | holder = (ViewHolder) view.getTag(); 46 | } 47 | holder.tv.setText(city.name); 48 | if(position == selection) { 49 | holder.tv.setBackgroundResource(pressBg); 50 | } else { 51 | holder.tv.setBackgroundResource(normalBg); 52 | } 53 | 54 | holder.mFilterMenuListItem.setOnClickListener(new OnClickListener() { 55 | @Override 56 | public void onClick(View v) { 57 | mOnItemClickListenerAdapterView.onItemClick(view, position, (City) getItem(position)); 58 | } 59 | }); 60 | 61 | 62 | return view; 63 | } 64 | 65 | class ViewHolder{ 66 | TextView tv; 67 | LinearLayout mFilterMenuListItem; 68 | } 69 | 70 | @Override 71 | public String getText(int position) { 72 | City city = (City) getItem(position); 73 | return city.name; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/com/filtermenu/adapter/MultiChoiceAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.adapter; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import android.app.Activity; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.CheckBox; 11 | import android.widget.CompoundButton; 12 | import android.widget.CompoundButton.OnCheckedChangeListener; 13 | import android.widget.TextView; 14 | 15 | import com.filtermenu.R; 16 | import com.filtermenu.model.City; 17 | import com.filtermenu.view.OnFilterMenuItemSelectListener; 18 | 19 | public class MultiChoiceAdapter extends MBaseAdapter{ 20 | 21 | private Map mCheckedData = new HashMap(); 22 | 23 | private OnFilterMenuItemSelectListener mOnFilterMenuItemSelectListener; 24 | 25 | public MultiChoiceAdapter(Activity context, List datas) { 26 | super(context, datas); 27 | } 28 | 29 | @Override 30 | public View getView(final int position, View convertView, ViewGroup parent) { 31 | ViewHolder holder; 32 | if (convertView == null) { 33 | holder = new ViewHolder(); 34 | convertView = mInflater.inflate(R.layout.filter_menu_multichoice_listview_item,null); 35 | holder.tv = (TextView) convertView.findViewById(R.id.tv); 36 | holder.mCheckBtn = (CheckBox) convertView.findViewById(R.id.mCheckBtn); 37 | convertView.setTag(holder); 38 | } 39 | 40 | holder = (ViewHolder) convertView.getTag(); 41 | 42 | City city = (City) getItem(position); 43 | 44 | holder.tv.setText(city.name); 45 | holder.mCheckBtn.setOnCheckedChangeListener(new OnCheckedChangeListener() { 46 | @Override 47 | public void onCheckedChanged(CompoundButton buttonView, 48 | boolean isChecked) { 49 | if (isChecked) { 50 | mCheckedData 51 | .put(position, (City) getItem(position)); 52 | } else { 53 | mCheckedData.remove(position); 54 | } 55 | } 56 | }); 57 | 58 | return convertView; 59 | } 60 | 61 | public void setOnFilterMenuItemSelectListener(OnFilterMenuItemSelectListener onFilterMenuItemSelectListener){ 62 | mOnFilterMenuItemSelectListener = onFilterMenuItemSelectListener; 63 | } 64 | 65 | public Map getCheckeds(){ 66 | return mCheckedData; 67 | } 68 | 69 | class ViewHolder{ 70 | TextView tv; 71 | CheckBox mCheckBtn; 72 | } 73 | 74 | @Override 75 | public String getText(int position) { 76 | return "筛选"; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/com/filtermenu/adapter/MBaseAdapter.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.adapter; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import android.app.Activity; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.BaseAdapter; 11 | 12 | public abstract class MBaseAdapter<?> extends BaseAdapter{ 13 | private Object tag; 14 | 15 | protected Activity mContext; 16 | protected List<?> datas = new ArrayList<?>(); 17 | protected LayoutInflater mInflater; 18 | 19 | protected int normalBg; 20 | protected int pressBg; 21 | protected int selection; 22 | 23 | /** 24 | * 通用点击事件回调类 25 | */ 26 | protected OnItemClickListenerAdapterView<?> mOnItemClickListenerAdapterView; 27 | 28 | public MBaseAdapter(Activity context, List<?> datas) { 29 | super(); 30 | this.mContext = context; 31 | if(datas != null){ 32 | this.datas = datas; 33 | } 34 | mInflater = LayoutInflater.from(context); 35 | } 36 | 37 | @Override 38 | public int getCount() { 39 | if(datas!=null){ 40 | return datas.size(); 41 | }else{ 42 | return 0; 43 | } 44 | } 45 | 46 | public Object getTag() { 47 | return tag; 48 | } 49 | 50 | public void setTag(Object tag) { 51 | this.tag = tag; 52 | } 53 | 54 | public List<?> getDatas(){ 55 | return datas; 56 | } 57 | 58 | public List getChildren(int position){ 59 | return datas; 60 | }; 61 | 62 | protected void initParams(int normalBg, int pressBg){ 63 | this.normalBg = normalBg; 64 | this.pressBg = pressBg; 65 | this.selection = -1; 66 | } 67 | 68 | public abstract String getText(int position); 69 | 70 | public void setPressPostion(int position) { 71 | this.selection = position; 72 | } 73 | 74 | /** 75 | * 在原有数据基础上增加数据 76 | * @param datas 77 | */ 78 | public void addDatas(List<?> datas){ 79 | if(datas != null){ 80 | getDatas().addAll(datas); 81 | } 82 | notifyDataSetChanged(); 83 | } 84 | 85 | /** 86 | * 重新填充数据 87 | * @param datas 88 | */ 89 | public void setDatas(List<?> datas){ 90 | if(datas != null){ 91 | getDatas().clear(); 92 | getDatas().addAll(datas); 93 | } 94 | notifyDataSetChanged(); 95 | } 96 | 97 | @Override 98 | public Object getItem(int position) { 99 | return datas.get(position); 100 | } 101 | 102 | @Override 103 | public long getItemId(int position) { 104 | return position; 105 | } 106 | 107 | @Override 108 | public abstract View getView(int position, View convertView, ViewGroup parent); 109 | 110 | public void setOnItemClickListenerAdapterView(OnItemClickListenerAdapterView onClickListenerAdapterView) { 111 | this.mOnItemClickListenerAdapterView = onClickListenerAdapterView; 112 | } 113 | 114 | public static interface OnItemClickListenerAdapterView { 115 | public void onItemClick(View view,int position, T t); 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/FilterMenuTwoList.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | import com.filtermenu.R; 4 | import android.content.Context; 5 | import android.util.AttributeSet; 6 | import android.view.LayoutInflater; 7 | import android.view.View; 8 | import android.widget.AdapterView; 9 | import android.widget.BaseAdapter; 10 | import android.widget.LinearLayout; 11 | import android.widget.ListView; 12 | import android.widget.AdapterView.OnItemClickListener; 13 | 14 | /** 15 | * 16 | * @author zhengjun1 17 | * 18 | */ 19 | public class FilterMenuTwoList extends LinearLayout { 20 | 21 | private ListView mParentListView; 22 | private ListView mChildrenListView; 23 | 24 | public FilterMenuTwoList(Context context) { 25 | super(context); 26 | initView(context); 27 | } 28 | 29 | public FilterMenuTwoList(Context context, AttributeSet attrs) { 30 | super(context, attrs); 31 | initView(context); 32 | } 33 | 34 | public FilterMenuTwoList(Context context, AttributeSet attrs, int defStyle) { 35 | super(context, attrs, defStyle); 36 | initView(context); 37 | } 38 | 39 | private void initView(Context context){ 40 | LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 41 | inflater.inflate(R.layout.filter_menutwo_listview, this, true); 42 | mParentListView = (ListView) findViewById(R.id.parent_listview); 43 | mChildrenListView = (ListView) findViewById(R.id.children_listview); 44 | } 45 | 46 | public void setParentAdapter(BaseAdapter parentAdapter){ 47 | if(mParentListView != null){ 48 | mParentListView.setAdapter(parentAdapter); 49 | } 50 | 51 | } 52 | 53 | public void setParentSelection(int position){ 54 | if(mParentListView != null){ 55 | mParentListView.setSelection(position); 56 | } 57 | } 58 | 59 | public void setChildrenSelection(int position){ 60 | if(mChildrenListView != null){ 61 | mChildrenListView.setSelection(position); 62 | } 63 | 64 | } 65 | 66 | public void setChildrenAdapter(BaseAdapter childrenAdapter){ 67 | if(mChildrenListView != null){ 68 | mChildrenListView.setAdapter(childrenAdapter); 69 | } 70 | } 71 | 72 | public void setOnParentFilterMenuItemClickListener(final OnFilterMenuItemClickListener onItemOnClickListener){ 73 | if(mParentListView != null){ 74 | mParentListView.setOnItemClickListener(new OnItemClickListener() { 75 | 76 | @Override 77 | public void onItemClick(AdapterView parent, View view, 78 | int position, long id) { 79 | if(onItemOnClickListener != null){ 80 | onItemOnClickListener.onItemClick(parent, view, position, id); 81 | } 82 | } 83 | }); 84 | } 85 | } 86 | 87 | public void setOnChildrenFilterMenuItemClickListener(final OnFilterMenuItemClickListener onItemOnClickListener){ 88 | if(mChildrenListView != null){ 89 | mChildrenListView.setOnItemClickListener(new OnItemClickListener() { 90 | 91 | @Override 92 | public void onItemClick(AdapterView parent, View view, 93 | int position, long id) { 94 | if(onItemOnClickListener != null){ 95 | onItemOnClickListener.onItemClick(parent, view, position, id); 96 | } 97 | } 98 | }); 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /src/com/filtermenu/FilterMenuBarMainActivity.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import android.app.Activity; 8 | import android.os.Bundle; 9 | import android.view.LayoutInflater; 10 | import android.view.View; 11 | import android.widget.AdapterView; 12 | 13 | import com.filtermenu.adapter.CityAdapter; 14 | import com.filtermenu.adapter.DistrictAdapter; 15 | import com.filtermenu.adapter.JobTypeAdapter; 16 | import com.filtermenu.adapter.MBaseAdapter; 17 | import com.filtermenu.adapter.MultiChoiceAdapter; 18 | import com.filtermenu.model.City; 19 | import com.filtermenu.model.District; 20 | import com.filtermenu.model.JobType; 21 | import com.filtermenu.view.FilterMenu; 22 | import com.filtermenu.view.FilterMenuBar; 23 | import com.filtermenu.view.FilterMenuBar2; 24 | import com.filtermenu.view.FilterMenuList; 25 | import com.filtermenu.view.FilterMenuListAdapter; 26 | import com.filtermenu.view.FilterMenuTwoList; 27 | import com.filtermenu.view.OnFilterMenuItemClickListener; 28 | import com.filtermenu.view.OnFilterMenusSelectedListener; 29 | 30 | public class FilterMenuBarMainActivity extends Activity { 31 | 32 | private FilterMenuBar2 mFilterMenuBar; 33 | private LayoutInflater inflater; 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | 38 | setContentView(R.layout.activity_filtermenu_bar); 39 | mFilterMenuBar = (FilterMenuBar2)findViewById(R.id.mFilterMenuBar2); 40 | 41 | List baseAdapters = new ArrayList(); 42 | 43 | FilterMenuListAdapter filterMenuListAdapter = new FilterMenuListAdapter(); 44 | filterMenuListAdapter.filterMenuType = FilterMenuListAdapter.MULTI_COLUMN; 45 | final CityAdapter cityAdapter = new CityAdapter(this,DataManager.getCities(), R.drawable.normal, R.drawable.press); 46 | final DistrictAdapter districtAdapter = new DistrictAdapter(this,DataManager.getCities().get(0).districts, R.drawable.normal,R.drawable.press); 47 | filterMenuListAdapter.parentAdapter = cityAdapter; 48 | filterMenuListAdapter.childrenAdapter= districtAdapter; 49 | 50 | FilterMenuListAdapter filterMenuListAdapter2 = new FilterMenuListAdapter(); 51 | filterMenuListAdapter2.parentAdapter = new JobTypeAdapter(this,DataManager.getJobTypes(), R.drawable.normal, R.drawable.press); 52 | 53 | FilterMenuListAdapter filterMenuListAdapter3 = new FilterMenuListAdapter(); 54 | filterMenuListAdapter3.parentAdapter = new MultiChoiceAdapter(this, DataManager.getCities()); 55 | 56 | FilterMenuListAdapter filterMenuListAdapter4 = new FilterMenuListAdapter(); 57 | filterMenuListAdapter4.parentAdapter = new MultiChoiceAdapter(this, DataManager.getCities()); 58 | 59 | baseAdapters.add(filterMenuListAdapter); 60 | baseAdapters.add(filterMenuListAdapter2); 61 | baseAdapters.add(filterMenuListAdapter3); 62 | baseAdapters.add(filterMenuListAdapter4); 63 | 64 | mFilterMenuBar.setFilterMenus(baseAdapters); 65 | 66 | mFilterMenuBar.setOnFilterMenusSelectedListener(new OnFilterMenusSelectedListener() { 67 | 68 | @Override 69 | public void onFilterMenuSelect(Map filterMenuSelectedValues) { 70 | //此处是所有列已经筛选的值。 71 | } 72 | }); 73 | 74 | } 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/com/filtermenu/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import android.app.Activity; 7 | import android.os.Bundle; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.widget.AdapterView; 11 | 12 | import com.filtermenu.adapter.CityAdapter; 13 | import com.filtermenu.adapter.DistrictAdapter; 14 | import com.filtermenu.adapter.JobTypeAdapter; 15 | import com.filtermenu.adapter.MultiChoiceAdapter; 16 | import com.filtermenu.model.City; 17 | import com.filtermenu.model.District; 18 | import com.filtermenu.model.JobType; 19 | import com.filtermenu.view.FilterMenu; 20 | import com.filtermenu.view.FilterMenuList; 21 | import com.filtermenu.view.FilterMenuTwoList; 22 | import com.filtermenu.view.OnFilterMenuItemClickListener; 23 | 24 | public class MainActivity extends Activity { 25 | private FilterMenu mFilterMenu; 26 | private FilterMenu mFilterMenu2; 27 | private FilterMenu mFilterMenu3; 28 | private LayoutInflater inflater; 29 | 30 | @Override 31 | protected void onCreate(Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | setContentView(R.layout.activity_main); 34 | mFilterMenu = (FilterMenu) findViewById(R.id.btn); 35 | // inflater = LayoutInflater.from(this); 36 | 37 | FilterMenuList menuList = new FilterMenuList(this); 38 | final JobTypeAdapter adapter = new JobTypeAdapter(this,DataManager.getJobTypes(), R.drawable.normal, R.drawable.press); 39 | menuList.setAdapter(adapter); 40 | menuList.setOnFilterMenuItemClickListener(new OnFilterMenuItemClickListener() { 41 | @Override 42 | public void onItemClick(AdapterView parent, View view, 43 | int position, long id) { 44 | adapter.setPressPostion(position); 45 | adapter.notifyDataSetChanged(); 46 | JobType jobType = (JobType) parent.getItemAtPosition(position); 47 | mFilterMenu.setText(jobType.name); 48 | mFilterMenu.hidePopup(); 49 | } 50 | }); 51 | //mFilterMenu.setPopupView(menuList); 52 | 53 | mFilterMenu2 = (FilterMenu) findViewById(R.id.btn2); 54 | final FilterMenuTwoList filterMenuMultiList = new FilterMenuTwoList( 55 | this); 56 | final CityAdapter cityAdapter = new CityAdapter(this,DataManager.getCities(), R.drawable.normal, R.drawable.press); 57 | final DistrictAdapter districtAdapter = new DistrictAdapter(this,DataManager.getCities().get(0).districts, R.drawable.normal, 58 | R.drawable.press); 59 | 60 | filterMenuMultiList.setParentAdapter(cityAdapter); 61 | filterMenuMultiList.setChildrenAdapter(districtAdapter); 62 | filterMenuMultiList.setOnParentFilterMenuItemClickListener(new OnFilterMenuItemClickListener() { 63 | 64 | @Override 65 | public void onItemClick(AdapterView parent, View view, 66 | int position, long id) { 67 | cityAdapter.setPressPostion(position); 68 | cityAdapter.notifyDataSetChanged(); 69 | City city = (City) parent.getItemAtPosition(position); 70 | districtAdapter.setDatas(city.districts); 71 | districtAdapter.setPressPostion(-1); 72 | filterMenuMultiList.setParentSelection(0); 73 | } 74 | }); 75 | filterMenuMultiList.setOnChildrenFilterMenuItemClickListener(new OnFilterMenuItemClickListener() { 76 | 77 | @Override 78 | public void onItemClick(AdapterView parent, View view, 79 | int position, long id) { 80 | districtAdapter.setPressPostion(position); 81 | districtAdapter.notifyDataSetChanged(); 82 | District district = (District) parent.getItemAtPosition(position); 83 | mFilterMenu2.setText(district.name); 84 | mFilterMenu2.hidePopup(); 85 | } 86 | }); 87 | // mFilterMenu2.setPopupView(filterMenuMultiList); 88 | 89 | mFilterMenu3 = (FilterMenu) findViewById(R.id.mFilterMenu3); 90 | MultiChoiceAdapter multiChoiceAdapter = new MultiChoiceAdapter(this, DataManager.getCities()); 91 | FilterMenuList filterMenuList = new FilterMenuList(this); 92 | filterMenuList.setAdapter(multiChoiceAdapter); 93 | //mFilterMenu3.setPopupView(filterMenuList); 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /src/com/filtermenu/view/FilterMenuBar.java: -------------------------------------------------------------------------------- 1 | package com.filtermenu.view; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | import android.app.Activity; 8 | import android.content.Context; 9 | import android.graphics.drawable.BitmapDrawable; 10 | import android.util.AttributeSet; 11 | import android.view.MotionEvent; 12 | import android.view.View; 13 | import android.widget.AdapterView; 14 | import android.widget.LinearLayout; 15 | import android.widget.PopupWindow; 16 | import android.widget.PopupWindow.OnDismissListener; 17 | 18 | import com.filtermenu.adapter.MBaseAdapter; 19 | import com.filtermenu.adapter.MBaseAdapter.OnItemClickListenerAdapterView; 20 | 21 | /** 22 | * 筛选栏 23 | * @author zhengjun1 24 | */ 25 | public class FilterMenuBar extends LinearLayout implements OnDismissListener{ 26 | 27 | private Context mContext; 28 | private int displayWidth; 29 | private int displayHeight; 30 | private Map mFilterMenus = new HashMap(); 31 | private Map mMBaseAdapters = new HashMap(); 32 | private Map mContentViews = new HashMap(); 33 | 34 | private View selectFilterMenu; 35 | private int selectPosition; 36 | 37 | private PopupWindow popupWindow; 38 | 39 | public FilterMenuBar(Context context) { 40 | super(context); 41 | mContext = context; 42 | init(context); 43 | } 44 | 45 | public FilterMenuBar(Context context, AttributeSet attrs) { 46 | super(context, attrs); 47 | mContext = context; 48 | init(context); 49 | } 50 | 51 | public FilterMenuBar(Context context, AttributeSet attrs, int defStyle) { 52 | super(context, attrs, defStyle); 53 | mContext = context; 54 | init(context); 55 | } 56 | 57 | public void setFilterMenus(List baseAdapters){ 58 | mMBaseAdapters.clear(); 59 | if(baseAdapters != null){ 60 | int count = baseAdapters.size(); 61 | for(int i=0;i < count;i++){ 62 | final MBaseAdapter adapter = baseAdapters.get(i); 63 | adapter.setTag(i); 64 | adapter.setOnItemClickListenerAdapterView(new OnItemClickListenerAdapterView() { 65 | @Override 66 | public void onItemClick(View view, int position, Object t) { 67 | int tag = (Integer) adapter.getTag(); 68 | MBaseAdapter adapter2 = mMBaseAdapters.get(tag); 69 | adapter2.setPressPostion(position); 70 | adapter2.notifyDataSetChanged(); 71 | FilterMenu filterMenu = mFilterMenus.get(tag); 72 | filterMenu.setText(adapter2.getText(position)); 73 | hidePopup(); 74 | } 75 | }); 76 | mMBaseAdapters.put(i,adapter); 77 | } 78 | } 79 | int count = mMBaseAdapters.size(); 80 | 81 | mContentViews.clear(); 82 | for(int i=0;i parent, View view, int position,long id) { 88 | int tag = (Integer) filterMenuList.getTag(); 89 | MBaseAdapter adapter = mMBaseAdapters.get(tag); 90 | adapter.setPressPostion(position); 91 | adapter.notifyDataSetChanged(); 92 | FilterMenu filterMenu = mFilterMenus.get(tag); 93 | filterMenu.setText(adapter.getText(position)); 94 | hidePopup(); 95 | } 96 | });*/ 97 | 98 | filterMenuList.setAdapter(mMBaseAdapters.get(i)); 99 | 100 | mContentViews.put(i, filterMenuList); 101 | } 102 | 103 | mFilterMenus.clear(); 104 | for(int i=0;i mFilterMenus = new HashMap(); 33 | private Map mMBaseAdapters = new HashMap(); 34 | private Map mContentViews = new HashMap(); 35 | 36 | private View selectFilterMenu; 37 | private int selectPosition; 38 | 39 | private PopupWindow popupWindow; 40 | 41 | private OnFilterMenusSelectedListener mOnFilterMenusSelectedListener; 42 | private Map mapSelectedFilterParams = new HashMap(); 43 | 44 | public FilterMenuBar2(Context context) { 45 | super(context); 46 | mContext = context; 47 | init(context); 48 | } 49 | 50 | public FilterMenuBar2(Context context, AttributeSet attrs) { 51 | super(context, attrs); 52 | mContext = context; 53 | init(context); 54 | } 55 | 56 | public FilterMenuBar2(Context context, AttributeSet attrs, int defStyle) { 57 | super(context, attrs, defStyle); 58 | mContext = context; 59 | init(context); 60 | } 61 | 62 | public void setFilterMenus(List baseAdapters){ 63 | if(baseAdapters != null){ 64 | int count = baseAdapters.size(); 65 | 66 | mFilterMenus.clear(); 67 | for(int i=0;i datas = adapter2.getChildren(position); 151 | adapter2.childrenAdapter.setDatas(datas); 152 | adapter2.childrenAdapter.setPressPostion(-1); 153 | adapter2.childrenAdapter.notifyDataSetChanged(); 154 | adapter2.parentAdapter.setPressPostion(position); 155 | } 156 | }); 157 | adapter.childrenAdapter.setOnItemClickListenerAdapterView(new OnItemClickListenerAdapterView() { 158 | @Override 159 | public void onItemClick(View view, int position, Object t) { 160 | int tag = (Integer) adapter.childrenAdapter.getTag(); 161 | FilterMenuListAdapter adapter2 = mMBaseAdapters.get(tag); 162 | adapter2.childrenAdapter.setPressPostion(position); 163 | adapter2.childrenAdapter.notifyDataSetChanged(); 164 | FilterMenu filterMenu = mFilterMenus.get(tag); 165 | filterMenu.setText(adapter2.childrenAdapter.getText(position)); 166 | mapSelectedFilterParams.put(tag, adapter2.childrenAdapter.getItem(position)); 167 | if(mOnFilterMenusSelectedListener != null){ 168 | mOnFilterMenusSelectedListener.onFilterMenuSelect(mapSelectedFilterParams); 169 | } 170 | hidePopup(); 171 | } 172 | }); 173 | 174 | FilterMenu filterMenu = mFilterMenus.get(i); 175 | if(adapter.childrenAdapter.getCount()>0){ 176 | mapSelectedFilterParams.put(i, adapter.childrenAdapter.getItem(0)); 177 | filterMenu.setText(adapter.childrenAdapter.getText(0)); 178 | }else{ 179 | mapSelectedFilterParams.put(i, null); 180 | filterMenu.setText(adapter.parentAdapter.getText(0)); 181 | } 182 | } 183 | } 184 | } 185 | initPopUpWindow(); 186 | } 187 | 188 | public void setOnFilterMenusSelectedListener(OnFilterMenusSelectedListener onFilterMenusSelectedListener){ 189 | mOnFilterMenusSelectedListener = onFilterMenusSelectedListener; 190 | } 191 | 192 | public void initPopUpWindow() { 193 | if (popupWindow == null) { 194 | popupWindow = new PopupWindow(mContentViews.get(selectPosition), displayWidth, displayHeight/2); 195 | 196 | // 为了解决popupWindow内不能获取点击事件 197 | popupWindow.setFocusable(false); 198 | popupWindow.setTouchable(true); 199 | //popupWindow.setOnDismissListener(this); 200 | //为了点击popupwindow之外的地方,使popupwindow消失 201 | popupWindow.setBackgroundDrawable(new BitmapDrawable()); 202 | popupWindow.setOutsideTouchable(true); 203 | 204 | } 205 | } 206 | 207 | public void show(View contentView,View filterMenu){ 208 | initPopUpWindow(); 209 | if(selectFilterMenu == filterMenu 210 | && popupWindow.isShowing()){ 211 | hidePopup(); 212 | }else { 213 | hidePopup(); 214 | showPopup(contentView); 215 | } 216 | 217 | } 218 | 219 | private void showPopup(View view) { 220 | if (popupWindow.getContentView() != view) { 221 | popupWindow.setContentView(view); 222 | popupWindow.update(); 223 | } 224 | popupWindow.showAsDropDown(this, 0, 0); 225 | } 226 | 227 | private void hidePopup(){ 228 | popupWindow.setOnDismissListener(this); 229 | popupWindow.dismiss(); 230 | } 231 | 232 | /** 233 | * 如果菜单成展开状态,则让菜单收回去 234 | */ 235 | public boolean onPressBack() { 236 | if (popupWindow != null && popupWindow.isShowing()) { 237 | popupWindow.dismiss(); 238 | if (selectFilterMenu != null) { 239 | selectFilterMenu.setSelected(false); 240 | } 241 | return true; 242 | } else { 243 | return false; 244 | } 245 | 246 | } 247 | 248 | private void init(Context context) { 249 | mContext = context; 250 | displayWidth = ((Activity) mContext).getWindowManager().getDefaultDisplay().getWidth(); 251 | displayHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight(); 252 | setOrientation(LinearLayout.HORIZONTAL); 253 | } 254 | 255 | @Override 256 | public void onDismiss() { 257 | //popupWindow.dismiss(); 258 | } 259 | 260 | } 261 | --------------------------------------------------------------------------------