RecyclerView+PopupWindow 自定义弹框

来源:互联网 发布:社交网络未来趋势 编辑:程序博客网 时间:2024/06/04 18:20

好久没写博客了,从7月份一直实习到现在,趁着过年有时间,整理一下今年学到的东西,弹框是我们一直需要的控件之一,所以弄一个好的弹框显示是蛮有必要的,这是我在我的项目里自己封装的一个弹框控件。
我们采用RecyclerView + PopupWindow要封装我们的弹框控件的样式,RecyclerView很强大,是谷歌新出的控件将会取代ListView,如果你还不会使用,应该去学习如何使用它,并且封装自己的RecyclerView.

首先

/**     * 初始化RecyclerView     */    public void initRecyclerView(){        if(null == mLayoutManager)            mLayoutManager = new LinearLayoutManager(mContext);        mRecyclerView.setLayoutManager(mLayoutManager);//设置样式        if(null != mItemAnimato)            mItemAnimato = new DefaultItemAnimator();        mRecyclerView.setItemAnimator(mItemAnimato); //设置动画        if(null != mItemDecoration)            mRecyclerView.addItemDecoration(mItemDecoration);//设置分割线    }

这里我们先初始化我们的RecyclerView,设置它的基本样式。

private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener {            private ImageView img;            private TextView tv;            private MyItemClickListener mListener;            private MyItemLongClickListener mLongClickListener;            public MyViewHolder(View view,MyItemClickListener listener,MyItemLongClickListener longClickListener) {                super(view);                img = (ImageView) view.findViewById(R.id.pop_img);                tv = (TextView) view.findViewById(R.id.pop_tv);                this.mListener = listener;                this.mLongClickListener = longClickListener;                view.setOnClickListener(this);                view.setOnLongClickListener(this);            }            @Override            public void onClick(View v) {                if(mListener != null){                    mListener.onItemClick(v,getPosition());                }            }            @Override            public boolean onLongClick(View v) {                if(mLongClickListener != null){                    mLongClickListener.onItemLongClick(v, getPosition());                }                return true;            }        }

创建我们的Viewholder类,在这个Viewholder类中,尽可能强大点,里面有你需要的样式。
接下来,新建我们的适配器Adapter

 private class RecyclerAdapter extends MyBaseAdapter{        private final static int X_TYPE = 1;        private final static int Y_TYPE = 2;        private final static int Z_TYPE = 3;        private List<ListPopInfo> mDatas;        private Context mContext;        public RecyclerAdapter(Context mContext,List<ListPopInfo> mDatas) {            this.mDatas = mDatas;            this.mContext = mContext;        }        @Override        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            RecyclerView.ViewHolder holder = null;            switch (viewType) {                case X_TYPE:                    holder = new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.listpop_item, parent, false), mListener, mLongClickListener);                    break;                case Y_TYPE:                    break;                case Z_TYPE:                    break;            }            return holder;        }        @Override        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {            super.onBindViewHolder(holder, position);            switch (getItemViewType(position)) {                case X_TYPE:                    MyViewHolder viewHolder = (MyViewHolder) holder;                    if(mDatas.get(position).getImgRes() == 0) {                        viewHolder.tv.setText(mDatas.get(position).getTvRes());                    }else {                        viewHolder.img.setImageResource(mDatas.get(position).getImgRes());                        viewHolder.tv.setText(mDatas.get(position).getTvRes());                    }            }        }        @Override        public int getItemCount() {            return null == mDatas ? 0 : mDatas.size() ;        }        @Override        public int getItemViewType(int position) {            return mDatas.get(position).getViewType();        }

在这里面我定义了三种样式,不过就实现了一种,预留空间,为以后样式增加做准备

/**     * 初始化adapter     */    public void initAdapter(){        if(null == mAdapter)            mAdapter = new RecyclerAdapter(mContext,mDatas);        mRecyclerView.setAdapter(mAdapter);        setAdapterListener();    }

初始化我们的Adapter,你可以选择自己在外实现,也可以选择使用默认
最后

 /**     * 初始化弹框     */    public void initPopWindows(){        mPopWindow = new PopupWindow(view,mWidth,mHeight);        mPopWindow.setFocusable(isFocusable);        mPopWindow.setOutsideTouchable(isOutsideTouchable);        if (null == mDrawable)            mDrawable = new BitmapDrawable();        mPopWindow.setBackgroundDrawable(mDrawable);    }

初始化弹框让它显示即可,并没有什么难度,只不过会比较好用一点,动态计算传入弹框的高度和宽度即可。至于完整的代码我稍后会上传

这里写图片描述

2017/2/15

补上项目:地址在这里

2 0
原创粉丝点击