利用RecycleView实现多条件筛选布局

记录时间:2017-12-11 15:48
话不多说,先上图,有需要的伙伴相详看:


图解0-0.png
图片0-1.png

基本样式是这样的(GIF制作略显麻烦,求原谅)。

说一下需求,点击筛选按钮弹出此页面。进行多项条件筛选,筛选完成点击确定加载数据。
弹出页面我用了PopupWindow喜欢用dialog实现的请自动忽略。。。
为了实现这种稍显复杂的页面,自定义了PopupWindow

public class FiltratePopup extends PopupWindow {
    private View view;
    private RecyclerAdapter mAdapter;
    FiltratePopup(final Context mContext, List<RecyclerModel> listData , View.OnClickListener listener) {
        this.view = LayoutInflater.from(mContext).inflate(R.layout.popup_filtrate_view, null);
        TextView mBtnSure = view.findViewById(R.id.btn_sure);
        mBtnSure.setOnClickListener(listener);
        RecyclerView mRecyclerView = view.findViewById(R.id.recyclerView);
        //设置布局管理器
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        //设置recycleView 滑动的方向
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);  
        mAdapter = new RecyclerAdapter(mContext,listData,R.layout.item_recy1);
        mRecyclerView.setAdapter(mAdapter);
        // 设置外部可点击
        this.setOutsideTouchable(true);
        // mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
        this.view.setOnTouchListener((v, event) -> {
            int height = view.findViewById(R.id.pop_layout).getTop();
            int y = (int) event.getY();
            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (y < height) {
                    dismiss();
                }
            }
            return true;
        });

    /* 设置弹出窗口特征 */
        // 设置视图
        this.setContentView(this.view);
        // 设置弹出窗体的宽和高
        this.setHeight(RelativeLayout.LayoutParams.MATCH_PARENT);
        this.setWidth(RelativeLayout.LayoutParams.MATCH_PARENT);

        // 设置弹出窗体可点击
        this.setFocusable(true);

        // 实例化一个ColorDrawable颜色为半透明
        ColorDrawable dw = new ColorDrawable(0xb0000000);
        // 设置弹出窗体的背景
        this.setBackgroundDrawable(dw);
    }

//设置公共方法 为了获取选择地值
    Map<String, String> getCheckData() {
        return mAdapter.getCheckData();
    }

    @Override
    public void showAsDropDown(View anchor) {
        if (Build.VERSION.SDK_INT >= 24) {
            Rect rect = new Rect();
            anchor.getGlobalVisibleRect(rect);
            int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
            setHeight(h);
        }
        super.showAsDropDown(anchor);
    }
}

样式和布局操作都在里面进行设置,其中RecyclerView的Adapter 参考了红橙DarrenRecyclerView更全解析之 - 打造通用的万能Adapter 非常感谢 红橙Darren大神的无私奉献。
展示通用的Adapter使用

public class RecyclerAdapter extends CommonRecyclerAdapter<RecyclerModel> {

    private Map<String, String> mapCheckData = new HashMap<>(); //存放点击后的选择项

    private Context mContext;

    public RecyclerAdapter(Context mContext, List<RecyclerModel> mData, int mLayoutId) {
        super(mContext, mData, mLayoutId);
        this.mContext = mContext;
    }

    @Override
    public void convert(ViewHolder holder, RecyclerModel item, int position) {
        holder.setText(R.id.tx_title, item.getTitle());
        List<String> listData = item.getContentList();
        FiltrateAdapter mAdapter = new FiltrateAdapter(mContext, listData, 1);
        holder.setGridViewAdapter(R.id.gv_filtrate, mAdapter,
                new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                        mAdapter.refresh(i, listData.size());   //点击后刷新页面显示效果
//判断当前选项是否被选中
                        if (mapCheckData.get(item.getTitle()) != null &&
                                mapCheckData.get(item.getTitle()).equals(listData.get(i))) { 

                            mapCheckData.remove(item.getTitle());
                        } else {
                            mapCheckData.put(item.getTitle(), listData.get(i));
                        }
                    }
                });
    }

    Map<String, String> getCheckData() {
        return mapCheckData;
    }
}

在MainActivity中引用自定义的PopupWindow

//设置popupView
    private void setPopupView() {
        mPopup = new FiltratePopup(getBaseContext(), mListData, view -> {
            mapCheckData = mPopup.getCheckData();
            if (mapCheckData != null && mapCheckData.size() > 0) {
                Toast.makeText(getBaseContext(), mapCheckData.toString(), Toast.LENGTH_SHORT).show();
                mTextView.setText(mapCheckData.toString());
            }
            mPopup.dismiss();
        });
    }
  private void initView() {
        mFiltrateLay = (LinearLayout) findViewById(R.id.lay_filtrate);

        mFiltrateLay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mPopup.showAsDropDown(mFiltrateLay);
            }
        });
        mTextView = (TextView) findViewById(R.id.textView3);
    }
}

如果想加酷炫的动画效果,请自行添加。。。

Demo已上传 →→

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容