實現二級Menu菜單

來源:互聯網
上載者:User

公司項目裡的需求,商城的左下角,要求有分類的Menu。

看圖:

1.當點擊一級分類,修改二級菜單裡面的內容。

2.同時一級菜單裡的背景變為右邊有白色三角的背景。

3.當點擊二級菜單的條目時候,Popupwindow消失,並且介面更新對應條目的商品資料。

我的實現思路是:左下角彈出Popupwindow,裡面使用兩個ListView實現。

我的Demo的效果:

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);
    }

 

註:現在還是熟練代碼的階段,好多東西都不清楚啊,需要學習的太多了。

 

極地大亂鬥台詞:毫無異樣的感覺,只不過是風聲而已。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.