本例要实现的是诸如美团/淘宝/百度糯米 多级分类菜单效果。当分类数量非常多时可以考虑采用两级分类,而诸如美团这种表现方式是一个不错的选择。

首先上效果图:


主要代码:

1. PopupWindow初始化过程:

popupWindow = new PopupWindow(this);        View view = LayoutInflater.from(this).inflate(R.layout.popup_layout, null);        leftLV = (ListView) view.findViewById(R.id.pop_listview_left);        rightLV = (ListView) view.findViewById(R.id.pop_listview_right);        popupWindow.setContentView(view);        popupWindow.setBackgroundDrawable(new PaintDrawable());        popupWindow.setFocusable(true);        popupWindow.setHeight(ScreenUtils.getScreenH(this) * 2 / 3);        popupWindow.setWidth(ScreenUtils.getScreenW(this));        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {            @Override            public void onDismiss() {                darkView.startAnimation(animOut);                darkView.setVisibility(View.GONE);                leftLV.setSelection(0);                rightLV.setSelection(0);            }        });

2.左侧菜单点击事件:

//左侧ListView点击事件        leftLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //二级数据                List<SecondClassItem> list2 = firstList.get(position).getSecondList();                //如果没有二级类,则直接跳转                if (list2 == null || list2.size() == 0) {                    popupWindow.dismiss();                    int firstId = firstList.get(position).getId();                    String selectedName = firstList.get(position).getName();                    handleResult(firstId, -1, selectedName);                    return;                }                FirstClassAdapter adapter = (FirstClassAdapter) (parent.getAdapter());                //如果上次点击的就是这一个item,则不进行任何操作                if (adapter.getSelectedPosition() == position){                    return;                }                //根据左侧一级分类选中情况,更新背景色                adapter.setSelectedPosition(position);                adapter.notifyDataSetChanged();                //显示右侧二级分类                updateSecondListView(list2, secondAdapter);            }        });

3. 右侧菜单点击事件:

//右侧ListView点击事件        rightLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //关闭popupWindow,显示用户选择的分类                popupWindow.dismiss();                int firstPosition = firstAdapter.getSelectedPosition();                int firstId = firstList.get(firstPosition).getId();                int secondId = firstList.get(firstPosition).getSecondList().get(position).getId();                String selectedName = firstList.get(firstPosition).getSecondList().get(position)                        .getName();                handleResult(firstId, secondId, selectedName);            }        });

4.顶部标签点击事件(即显示/隐藏 分类菜单)

 if (popupWindow.isShowing()) {            popupWindow.dismiss();        } else {            popupWindow.showAsDropDown(findViewById(R.id.main_div_line));            popupWindow.setAnimationStyle(-1);            //背景变暗            darkView.startAnimation(animIn);            darkView.setVisibility(View.VISIBLE);        }

5.根据左侧点击,刷新右侧ListView

//刷新右侧ListView    private void updateSecondListView(List<SecondClassItem> list2,                                      SecondClassAdapter secondAdapter) {        secondList.clear();        secondList.addAll(list2);        secondAdapter.notifyDataSetChanged();    }

源码下载(免积分哦):

http://download.csdn.net/detail/books1958/7992863

更多相关文章

  1. Android(安卓)旋转屏幕时禁止Activity重建
  2. Android之给ImageView添加点击效果
  3. 程序猿媛一:Android滑动翻页+区域点击事件
  4. Android(安卓)framework层 按键的处理流程
  5. Android(安卓)进度条 ProgressBar (隐藏、出现、加载进度)
  6. 《Monkey Android》第6课点击事件的四种写法
  7. AndroidStudio创建TV-APP,出现Error:(28, 13) Failed to resolve:
  8. Android(安卓)触摸事件机制(四) ViewGroup中触摸事件详解
  9. android中如何实现连续点击返回键退出整个应用 android两次返回

随机推荐

  1. android 客户端 smtp 协议发送数据
  2. Android获取单选与复选框的值
  3. android 判断文件是否存在
  4. Android之MediaPlayer(两种)基本使用方式
  5. C#内置泛型委托之Func委托
  6. C++单例模式的懒汉模式和饿汉模式详解
  7. ASP.NET CORE实现跨域
  8. C++的数据共享与保护你了解吗
  9. PHP json_encode中文乱码解决方法
  10. Vue.js中v-for指令的用法介绍