Android 仿京東側(cè)滑篩選

仿京東篩選

  • 簡(jiǎn)單介紹

這個(gè)demo寫(xiě)的是仿京東的側(cè)滑篩選頁(yè)面,點(diǎn)擊進(jìn)入篩選后進(jìn)入二級(jí)篩選,兩次側(cè)滑的篩選,還包括ListView+CheckBox滑動(dòng)沖突,ListView+ GridView顯示一行問(wèn)題解決,接口回調(diào)傳遞數(shù)據(jù)等

  • 效果圖
這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述
  • 簡(jiǎn)單得代碼介紹

1.首頁(yè)側(cè)滑用的是安卓官方V4包中的DrawerLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <FrameLayout
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <TextView
            android:id="@+id/screenTv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center|top"
            android:layout_marginTop="200dp"
            android:text="仿京東篩選"
            android:textSize="20sp" />
    </FrameLayout>

    <LinearLayout
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        android:orientation="vertical" />

</android.support.v4.widget.DrawerLayout>

2.一級(jí)頁(yè)面是自定義的layout,作為DrawerLayout的側(cè)滑頁(yè)面添加進(jìn)去menuHeaderView = new RightSideslipLay(ScreeningActivity.this); navigationView.addView(menuHeaderView);
發(fā)現(xiàn)的一個(gè)小的技巧想要側(cè)滑不隨滑動(dòng)而滑動(dòng),只能點(diǎn)擊才出現(xiàn)側(cè)滑的話,可以先鎖定
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);這樣就不一直跟著手勢(shì)側(cè)滑了

3.一級(jí)界面 ListVIew嵌套GridView,GridView得做自設(shè)配高度的自定義,不然只能顯示一行,具體參源碼AutoMeasureHeightGridView這個(gè)類

4.接下來(lái)是解析數(shù)據(jù)綁定數(shù)據(jù)了,還算比較簡(jiǎn)單。定義模型類,京東的篩選默認(rèn)每項(xiàng)顯示數(shù)據(jù)3個(gè)即一行。我現(xiàn)在默認(rèn)的是都是關(guān)閉的,只有第一項(xiàng)是打開(kāi)的,默認(rèn)顯現(xiàn)9個(gè)即3行,點(diǎn)擊查看更多就能進(jìn)入下一級(jí)頁(yè)面。參看圖二

5.二級(jí)頁(yè)面是一個(gè)PopupWindow,設(shè)置了PopupWindow的位置和動(dòng)畫(huà)達(dá)到,也能像一級(jí)界面也樣,右邊側(cè)滑出來(lái),點(diǎn)擊側(cè)滑收回去的效果。`
/**
* 創(chuàng)建PopupWindow
*/
private PopupWindow mMenuPop;
public RightSideslipChildLay mDownMenu;

protected void initPopuptWindow(List<AttrList.Attr.Vals> mSelectData) {
    mDownMenu = new RightSideslipChildLay(getContext(), ValsData, mSelectData);
    if (mMenuPop == null) {
        mMenuPop = new PopupWindow(mDownMenu, LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
    }
    mMenuPop.setBackgroundDrawable(new BitmapDrawable());
    mMenuPop.setAnimationStyle(R.style.popupWindowAnimRight);
    mMenuPop.setFocusable(true);
    mMenuPop.showAtLocation(RightSideslipLay.this, Gravity.TOP, 100, UiUtils.getStatusBarHeight(mCtx));
    mMenuPop.setOnDismissListener(new PopupWindow.OnDismissListener() {

        @Override
        public void onDismiss() {
            dismissMenuPop();
        }
    });
}`

此頁(yè)面是一個(gè)ListView里包含CheckBox,對(duì)于CheckBox滑動(dòng)選中錯(cuò)位的問(wèn)題在這個(gè)demo中也有解決,此法一本萬(wàn)利??梢韵螺ddemo來(lái)參考。大體思路是CheckBox選中的狀態(tài)對(duì)象的存在需要顯示的對(duì)象里,設(shè)置對(duì)象的一個(gè)屬性,記錄CheckBox選中的狀態(tài)。

6.對(duì)于頁(yè)面件數(shù)據(jù)的傳遞使用的接口回調(diào)。包括Adapter數(shù)據(jù)操作的傳出和一級(jí)頁(yè)面?zhèn)魅攵?jí)頁(yè)面,二級(jí)頁(yè)面在回傳給一級(jí)頁(yè)面顯示。一級(jí)頁(yè)面在傳出給主頁(yè)面(這個(gè)沒(méi)有寫(xiě))也可以用其他數(shù)據(jù)傳遞的方式,這只是方法之一。

7.本人也是小菜鳥(niǎo)一枚,第一次使用markdown寫(xiě)博文,有啥不妥的地方歡迎留言討論,項(xiàng)目下載地址:

http://download.csdn.net/detail/qq_15795335/9752495

原創(chuàng)博客,轉(zhuǎn)載說(shuō)明。記錄自己成長(zhǎng)的步伐!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容