├── 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 |
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 | 
16 | 
17 | 
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 |
--------------------------------------------------------------------------------