实现二级Menu菜单

公司项目里的需求,商城的左下角,要求有分类的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://www.cnblogs.com/outOfview/p/3275694.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VBA字典可以用来实现二级菜单功能,通过在字典中嵌套另一个字典来实现。 首先,我们可以创建一个主菜单的字典,其中键代表主菜单的选项,值代表对应的子菜单的字典。例如: ``` Dim menu As Object Set menu = CreateObject("Scripting.Dictionary") menu.Add "文件", CreateObject("Scripting.Dictionary") menu("文件").Add "新建", "New" menu("文件").Add "打开", "Open" menu.Add "编辑", CreateObject("Scripting.Dictionary") menu("编辑").Add "复制", "Copy" menu("编辑").Add "剪切", "Cut" ``` 然后,我们可以通过循环遍历主菜单的字典,让用户选择主菜单的选项,并显示对应的子菜单选项。例如: ``` Dim choice As String Dim subChoice As String For Each key In menu.Keys Debug.Print key Next key choice = InputBox("请输入主菜单选项:") If menu.Exists(choice) Then For Each subKey In menu(choice).Keys Debug.Print subKey Next subKey subChoice = InputBox("请输入子菜单选项:") '根据用户选择的子菜单选项执行相应的操作 If menu(choice).Exists(subChoice) Then Select Case menu(choice)(subChoice) Case "New" '执行新建操作 Case "Open" '执行打开操作 Case "Copy" '执行复制操作 Case "Cut" '执行剪切操作 End Select Else MsgBox "无效的子菜单选项" End If Else MsgBox "无效的主菜单选项" End If ``` 通过上面的代码,我们就可以通过VBA字典实现二级菜单功能,让用户可以方便地选择主菜单和子菜单的选项,并执行对应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值