实现二级Menu菜单_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 实现二级Menu菜单

实现二级Menu菜单

 2013/8/22 21:02:37  风景线外  博客园  我要评论(0)
  • 摘要:公司项目里的需求,商城的左下角,要求有分类的Menu。看图:1.当点击一级分类,修改二级菜单里面的内容。2.同时一级菜单里的背景变为右边有白色三角的背景。3.当点击二级菜单的条目时候,Popupwindow消失,并且界面更新对应条目的商品数据。我的实现思路是:左下角弹出Popupwindow,里面使用两个ListView实现。我的Demo的效果:1,点击一级菜单分类,修改二级菜单里面的内容:listView.setOnItemClickListener
  • 标签:实现 菜单

公司项目里的需求,商城的左下角,要求有分类的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);
    }

 

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

 

极地大乱斗台词:毫无异样的感觉,只不过是风声而已。

发表评论
用户名: 匿名