? ? 最近要實現(xiàn)一個點下拉分類篩選菜單,? 選全國區(qū)域聯(lián)動,? 這里數(shù)據(jù)時參照網(wǎng)上本地存放省市區(qū)數(shù)據(jù)庫.
? ? ?由于項目實際要滿足從接口異步獲取,? 所以整體采用MVP做了小拆分.? 自定義的級聯(lián)菜單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);
? ? ? ? /**
? ? ? ? * 開始獲取數(shù)據(jù)
? ? ? ? */
? ? ? ? void start();
? ? ? ? //? ? /**
//? ? * 第一級菜單數(shù)據(jù)
//? ? *
//? ? * @return
//? ? */
//? ? void requestFirstItem();
? ? ? ? /**
? ? ? ? * 第二級菜單數(shù)據(jù)
? ? ? ? *
? ? ? ? * @param parentMenuData
? ? ? ? */
? ? ? ? void requestSecondMenuList(MenuData parentMenuData);
? ? ? ? /**
? ? ? ? * 第三極菜單數(shù)據(jù)
? ? ? ? *
? ? ? ? * @param parentMenuData
? ? ? ? */
? ? ? ? void requestThirdMenuList(MenuData parentMenuData);
? ? }
}
~~~
最終實現(xiàn)效果如下
看下使用
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);
//設(shè)置回調(diào)接口
cascadingMenuView.setCascadingMenuViewOnSelectListener(new MCascadingMenuViewOnSelectListener());
rootView.setOnClickListener(new View.OnClickListener() {//點擊區(qū)域外退出
? ? @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: 這里可做異步取數(shù)據(jù)
? ? ? ? ArrayList menuList =dBhelper.getProvince();
? ? ? ? // TODO: 取數(shù)據(jù)完更新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.”