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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • signed apk error [WifiManagerLeak]

    signed apk error [WifiManagerLeak]

    2021年9月30日
  • latex中如何正确输入 双引号「建议收藏」

    latex中如何正确输入 双引号「建议收藏」latex中输入双引号时,如果都直接用键盘上的双引号键,打出的是一顺撇的。左面引号的正确输入法是:按两次“Tab上面,数字1左面那个键”。至于后边的引号,与老方法是一样的,即按两次单引号键(或一次SHIFT+单引号键—也就是一次双引号键啦怎么输入左单引号、左双引号、右单引号、有双引号?左单引号:`(键盘上1旁边的那个);左双引号:“;右单引号:'(键盘分号的右边那个);右双引号:”或”。在

    2022年4月19日
  • opencv-contrib模块详解_opencv安装包

    opencv-contrib模块详解_opencv安装包文章目录一、下载与安装二、编译opencv三、编译opencv_contrib四、visualstudio编译五、配置opencv环境配置系统环境变量重新配置项目环境六、测试近来由于需要用到opencv的SIFT特征,但是SIFT等功能已经移入了opencv_contrib中,所以需要重新编译opencv和opencv_contrib。一、下载与安装下载特定版本的opencv和ope…

    2022年8月30日
  • 脉冲控制仪设置参数_科迈控制器中文说明书

    脉冲控制仪设置参数_科迈控制器中文说明书驱动修改点A:sensor_xxxx_mipi_raw.c1.获取PD信息函数staticconstcmr_u16xxxx_pd_is_right[]=PD点位置信息,遮住右半边表示右点,用1表示,遮住左半边表示左点,用0表示;具体需要看sensorstaticconstcmr_u16xxxx_pd_row[]=PD位置行坐标staticconstcmr_u16xxxx_pd_col[]=PD位置列坐标staticconststructpd_pos_info_

    2022年9月6日
  • Postman工具_postman安装使用教程

    Postman工具_postman安装使用教程postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好。无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一。那么接下来就介绍下postman到底有哪些功能,它们分别都能干些什么。下面先通过一张图来直观的来看下postman中所包含的功能。图片当然,以上功能也只是展示了postman的一部分功能,为了能更加全面的体现这款工具的特点,我将从以下三个维度来加以说明。它们分别是: 基础功能

    2022年9月2日
  • addrule android用法,RelativeLayout.LayoutParams 使用addRule失效的问题解决办法[通俗易懂]

    addrule android用法,RelativeLayout.LayoutParams 使用addRule失效的问题解决办法[通俗易懂]Buttonbtn1;btn1.setId(1001);intwidth;//layoutwidth;intbtnWidth;//btnwidth;intbtnHeight;//btnheight;…….RelativeLayout.LayoutParamsp=newRelativeLayout.LayoutParams(btnWidth,btnHeight…

    2022年7月17日

发表回复

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

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