Android中实现二级菜单

Android中实现二级菜单公司项目里的需求,商城的左下角,要求有分类的Menu。看图:1.当点击一级分类,修改二级菜单里面的内容。2.同时一级菜单里的背景变为右边有白色三角的背景。3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。我的Demo的效果:

大家好,又见面了,我是你们的朋友全栈君。

公司项目里的需求,商城的左下角,要求有分类的Menu。

看图:

Menu效果图

1.当点击一级分类,修改二级菜单里面的内容。

2.同时一级菜单里的背景变为右边有白色三角的背景。

3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。

我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。

我的Demo的效果:

双ListView效果

1,点击一级菜单分类,修改二级菜单里面的内容:

listView.setOnItemClickListener(new OnItemClickListener() {

            @Override 
            public void onItemClick(AdapterView<?> arg0, View arg1, 
                    int position, long arg3) { 
                final int location = position; 
                myAdapter.setSelectedPosition(position);//adapter中的方法,将当前点击位置,告诉adapter。adapter根据position设置响应位置的数据。 
                myAdapter.notifyDataSetInvalidated(); 
                subAdapter = new SubAdapter(MenuPop.this.context, cities, 
                        images, position); 
                subListView.setAdapter(subAdapter); 
                subListView.setOnItemClickListener(new OnItemClickListener() {//二级菜单,根据一级菜单数据修改。

                    @Override 
                    public void onItemClick(AdapterView<?> arg0, View arg1, 
                            int position, long arg3) { 
                        Toast.makeText(MenuPop.this.context, 
                                cities[location][position], Toast.LENGTH_SHORT) 
                                .show(); 
                    } 
                }); 
            } 
        });

2,adapter中数据设置

// 设置选中效果(改变背景图片) 
        if (selectedPosition == position) { 
            holder.textView.setTextColor(Color.BLUE); 
            holder.layout.setBackgroundResource(R.drawable.fenlei_blue_on); 
        } else { 
            holder.textView.setTextColor(Color.WHITE); 
            holder.layout.setBackgroundColor(Color.TRANSPARENT); 
        }

 

//设置数据,数据现在是固定在String数组中

if (position == 0) { 
            holder.imageView.setBackgroundResource(R.color.transparent); 
        } else if (position == 1) { 
            holder.imageView.setBackgroundResource(R.color.transparent);

        } else { 
            holder.imageView.setBackgroundResource(images[position]);

        }

3,产生Popupwindow的类,通过new该对象,得到新的Popupwindow。

//构造方法中,传入当前上下文,初始化双ListView布局,设置adapter。

public MenuPop(Context context, SecondFragmentCallback callback) { 
        super(); 
        this.context = context; 
        this.callback = callback;

        View view = LayoutInflater.from(context) 
                .inflate(R.layout.popmenu, null);

        // 设置listview 
        listView = (MyListView) view.findViewById(R.id.listView); 
        subListView = (MyListView) view.findViewById(R.id.subListView); 
        myAdapter = new MyAdapter(context, foods, images); 
        listView.setAdapter(myAdapter); 
        selectDefult(); 

 

//Popupwindow显示位置控制

//Popupwindow菜单的隐藏方法

// showAsDropDown,默认位置在锚点的左下,如果左下没有空间,就显示在左上 
    public void showAsDropUp(View parent) { 
        popupWindow 
                .showAtLocation(parent, Gravity.LEFT | Gravity.BOTTOM, 0, 90); 
        popupWindow.showAsDropDown(parent, 0, 0);

        // 显示的位置

        // 使其聚集 
        popupWindow.setFocusable(true); 
        // 使其允许在外点击消失 
        popupWindow.setOutsideTouchable(true); 
        // 刷新状态 
        popupWindow.update(); 
    }

    // 隐藏菜单 
    public void dismiss() { 
        popupWindow.dismiss(); 
    }

布局文件:Popupwindow中横向并排两个ListView;

              adapter中的ListView-item左边图片,右边textview。

*****************************************

自定义的MyListView,开启子线程,动态更新UI。

class MyListView extends ListView implements Runnable == 继承ListView,实现Runnable方法。

//主要override 的方法:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
        switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
            if (mLastDownY == 0f && mDistance == 0) { 
                mLastDownY = event.getY(); 
                return true; 
            } 
            break;

        case MotionEvent.ACTION_CANCEL: 
            break;

        case MotionEvent.ACTION_UP: 
            if (mDistance != 0) { 
                mStep = 1; 
                mPositive = (mDistance >= 0); 
                /** 
                 * post 
                 * 
                 * Causes the Runnable to be added to the message queue. The 
                 * runnable will be run on the user interface thread. 
                 * 触发子线程被添加到消息队列事件。该子线程将运行在用户接口线程。 This method can be invoked 
                 * from outside of the UI thread only when this View is attached 
                 * to a window. 只有当View控件被加入一个窗体,该方法从外部UI线程被调用 
                 */ 
                this.post(this); 
                return true; 
            } 
            mLastDownY = 0f; 
            mDistance = 0; 
            break;

        case MotionEvent.ACTION_MOVE: 
            if (mLastDownY != 0f) { 
                mDistance = (int) (mLastDownY – event.getY()); 
                if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt( 
                        0).getTop() == 0) 
                        || (mDistance > 0 && getLastVisiblePosition() == getCount() – 1)) { 
                    mDistance /= 2; 
                    scrollTo(0, mDistance); 
                    return true; 
                } 
            } 
            mDistance = 0; 
            break; 
        } 
        return super.onTouchEvent(event); 
    }

 

注:现在还是熟练代码的阶段,好多东西都不清楚啊,需要学习的太多了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141667.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MIPS中一个字等于多少字节

    MIPS中一个字等于多少字节字节是 byte 包括 8 个二进制位 字是 word 长度与架构有关 如 mips 包括 32 个二进制位 一个字就是 4 个字节 它们的区别就是长度不一样 内存中是按字节寻值 因此是每 byte 也就是每 8 位存一个数值 当你想取一个 word 出来的时候 就是连续取了 4 个 byte 出来 然后拼成一个 word xx 位机的 xx 位是指字长 这个字和 word 不一样 是指这种 CPU 一次

    2025年9月14日
    4
  • css宋体代码_CSS字体代码

    css宋体代码_CSS字体代码宋体 SimSun 黑体 SimHei 微软雅黑 MicrosoftYaH 微软正黑体 MicrosoftJhe 新宋体 NSimSun 新细明体 PMingLiU 细明体 MingLiU 标楷体 DFKai SB 仿宋 FangSong 楷体 KaiTi 仿宋 GB2312FangSo GB2312 楷体 GB2312KaiTi GB2312 宋体 SimSuncss 中中文字体 font family 的英文名称 Ma

    2025年11月18日
    5
  • drawcall优化_unity降低drawcall

    drawcall优化_unity降低drawcallunity3D对于移动平台的支持无可厚非,但是也有时候用Unity3D开发出来的应用、游戏在移动终端上的运行有着明显的效率问题,比如卡、画质等各种问题。自己在做游戏开发的时候偶有所得。对于主要影响性能的因素做个总结。主要因素有:       1.     Savedbybatching值过大  —->这个值主要是针对Mesh的批处理,这个值越高,应用就越卡

    2025年11月19日
    6
  • java标识符是什么_Java 标识符「建议收藏」

    java标识符是什么_Java 标识符「建议收藏」什么是标识符标识符就是程序员在编写Java程序时,自定义的一些名字。例如第一个Java程序里关键字class后跟的HelloWorld,就是我们自定义的类名。类名就属于标识符的一种。标识符除了应用在类名上,还可以用在接口、变量、方法名、包名上。(要求同学们先记住,以后会详细见到这些)。标识符命名规则标识符由字母、下划线、美元符或数字组成标识符不能以数字开头,不能是关键字标识符严格区分大…

    2022年7月9日
    23
  • 电赛练习之旋转倒立摆PID调节[通俗易懂]

    电赛练习之旋转倒立摆PID调节[通俗易懂]前言:在家准备电赛控制题,第一个选择的旋转倒立摆,结构和电路相对简单,对于新手比较友好。本人今年大二,自学的STM32和PID算法,本文算是对这个题目练习的记录吧,文章和程序有误的地方还请大家多多指教。一、机械结构考虑到正式比赛时需要自己搭建机械结构,我就没有直接购买现成的机械结构。关于机械结构还是平时接触太少了,随便在淘宝上买的不锈钢打孔支架作摆臂和旋转臂,最后发现传感器没法安放,强行用电机支架和胶带固定住。最困难的是怎么把电机和旋转臂连接得牢靠,最开始用的一个联轴器,发现转的猛了就会松动,想尽各种办

    2022年8月18日
    6
  • vpp命令总结_gdb调试命令总结

    vpp命令总结_gdb调试命令总结createsubBondEthernet0834创建子接口,tag是834setinterfaceiptableBondEthernet0.8341将此接口设置在fib1里setinterfaceipaddressBondEthernet0.834192.168.0.250/24设置接口ipsetinterfaces

    2025年7月31日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号