06 | Android 项目笔记 实现下拉三级联动菜单选择

    最近要实现一个点下拉分类筛选菜单,  选全国区域联动,  这里数据时参照网上本地存放省市区数据库.

     由于项目实际要满足从接口异步获取,  所以整体采用MVP做了小拆分.  自定义的级联菜单CascadingMenuView作为VIew, 外部传入处理逻辑的presenter,  为了简化, 这里的请求也放presenter中没抽出model

MVP的契约类

~~~

public interface CascadingMenuContract {

interface View {

void setFirstMenuList(List menuList, int selectPosition);

void setSecondMenuList(List menuList);

void setThirdMenuList(List menuList);

    }

interface Presenter {

void setView(CascadingMenuContract.View view);

        /**

        * 开始获取数据

        */

        void start();

        //    /**

//    * 第一级菜单数据

//    *

//    * @return

//    */

//    void requestFirstItem();

        /**

        * 第二级菜单数据

        *

        * @param parentMenuData

        */

        void requestSecondMenuList(MenuData parentMenuData);

        /**

        * 第三极菜单数据

        *

        * @param parentMenuData

        */

        void requestThirdMenuList(MenuData parentMenuData);

    }

}

~~~

最终实现效果如下


看下使用

1. 用Fragment做整个弹窗的容器,  布局如下

~~~

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@color/half_transparent"

    android:orientation="vertical">

        android:id="@+id/cascadingMenuView"

        android:layout_width="match_parent"

        android:layout_height="@dimen/cascading_menu_max_height"

        android:background="@color/transparent"

        app:EMenuType="Three"

        app:itemSelectedDrawableId="@drawable/choose_item_selected"

        app:itemSelector="@drawable/choose_item_selector" />

</LinearLayout>

~~~

2. 初始化

~~~


cascadingMenuView =rootView.findViewById(R.id.cascadingMenuView);

//绑定Presenter

cascadingMenuView.startLoad(presenter);

//设置回调接口

cascadingMenuView.setCascadingMenuViewOnSelectListener(new MCascadingMenuViewOnSelectListener());

rootView.setOnClickListener(new View.OnClickListener() {//点击区域外退出

    @Override

    public void onClick(View v) {

Toast.makeText(getActivity(), "点菜单外隐藏", Toast.LENGTH_SHORT).show();

        if (listener !=null) {

listener.dismissMenu();

        }

}

});

~~~

3. 传入的presenter如下

~~~

private class MenuDataPresenterimplements CascadingMenuContract.Presenter {

private CascadingMenuContract.ViewmView;

    public void setView(CascadingMenuContract.View mView) {

this.mView = mView;

    }

@Override

    public void start() {

// TODO: 这里可做异步取数据

        ArrayList menuList =dBhelper.getProvince();

        // TODO: 取数据完更新UI

        mView.setFirstMenuList(menuList, 0);

    }

@Override

    public void requestSecondMenuList(MenuData parentMenuData) {

ArrayList secondMenuList =dBhelper.getCity(parentMenuData.getMenu_id());

        mView.setSecondMenuList(secondMenuList);

    }

@Override

    public void requestThirdMenuList(MenuData parentMenuData) {

ArrayList thirdMenuList =dBhelper.getDistrict(parentMenuData.getMenu_id());

        mView.setThirdMenuList(thirdMenuList);

    }

}

~~~

 好吧, 说多感觉就是词穷,  

 “Talk is cheap. Show me the code.”

GitHub - kluo88/MyDemo: 一些Demo集

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,072评论 25 709
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 13,729评论 2 59
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,254评论 0 17
  • 正是四月初八,佛诞日。 洛阳行像,万人空巷。起于长秋寺,六牙负释迦像被众人簇拥前行。金刚力士游于其间,辟邪狮子舞于...
    郑锡周阅读 1,024评论 0 2
  • 暖气停了,算了算时间,距离穿旗袍也就还有两个月的时间。于是,运动又要再打起精神来一发了。 说起运动,我的身体大概经...
    元茜姑娘阅读 1,425评论 1 6

友情链接更多精彩内容