Android自定义组件之ListPopWindow
最近小编在学习IOS开发,感触颇深,看到了iOS里面封装了好多组件,很多组件都是iOS自带的,相信一般的小公司的产品经理都是按照iOS的交互来设计UI,而且还要求Android要和iOS统一风格,这让Android开发人员很头痛,iOS自带组件很容易实现,而Android可能需要重写控件去配合iOS的效果。其实这样必然会导致性能的小将,或有些许的卡顿。小编个人认为,按照各自系统的风格和规范进行设计才能把自己的优点发挥到最大化。
下面就引出了今天的主题,自定义组件ListPopWindow,iOS中,这个效果是自带的。PopWindow可以说在项目里用的比较多的了,可能有n处要用到PopWindow,那么自定义一个PopWindow,到处来用更方便一些。
先看一下效果:
效果就是这样,看一下实现,其实也没多难,就是想开源出来供小伙伴们使用,如有不合理地方,希望大家多多指正。
1.自定义PopWindow
首先我们分析一下,这样的效果肯定是一个PopWindow嵌套着listview,而上面的title、和下面的cancel是两个文本框,实现起来也比较简单。
然后我们在PopWindow中声明两个接口,用来回调cancel和item的点击事件
public interface OnPopItemClickListener{void onPopItemClick(View view,int position);}public interface OnBottomTextviewClickListener{void onBottomClick();}
然后再设置一些PopWindow的一些属性
parentView = LayoutInflater.from(context).inflate(R.layout.list_popwindow,null);setContentView(parentView);lv = (ListView) parentView.findViewById(R.id.lv_popwindow);//设置弹出窗体的高this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);//设置弹出窗体可点击this.setFocusable(true);//实例化一个ColorDrawable颜色为半透明ColorDrawable dw = new ColorDrawable(0xb0000000);//设置SelectPicPopupWindow弹出窗体的背景this.setBackgroundDrawable(dw);
看一下整体的代码吧:
/*** Created by Hankkin on 16/1/25.*/
public class ListPopWindow extends PopupWindow{private Context context; //上下文private View parentView; //父视图private List<PopBean> dataList; //item数据源private OnPopItemClickListener listener; //item点击接口private ListView lv; //item列表视图private View viewTop; //title视图 private String topText,bottomText; //title文字,bottom文字private TextView tvTop,tvBottom; //title文本,bottom文本private PopWindowAdapter adapter; //适配器private OnBottomTextviewClickListener bottomListener;//底部点击接口public interface OnPopItemClickListener{void onPopItemClick(View view,int position);}public interface OnBottomTextviewClickListener{void onBottomClick();}public ListPopWindow(Context context,OnPopItemClickListener listener,OnBottomTextviewClickListener bottomListener,View parentView,List<PopBean> dataList,String bottomText,String topText){this.context = context;this.listener = listener;this.parentView = parentView;this.dataList = dataList;this.bottomListener = bottomListener;this.topText = topText;this.bottomText = bottomText;initViews();}private void initViews(){parentView = LayoutInflater.from(context).inflate(R.layout.list_popwindow,null);setContentView(parentView);lv = (ListView) parentView.findViewById(R.id.lv_popwindow);//设置弹出窗体的高this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);//设置弹出窗体可点击this.setFocusable(true);//实例化一个ColorDrawable颜色为半透明ColorDrawable dw = new ColorDrawable(0xb0000000);//设置SelectPicPopupWindow弹出窗体的背景this.setBackgroundDrawable(dw);//view添加OnTouchListener监听判断获取触屏位置如果在布局外面则销毁弹出框parentView.setOnTouchListener(new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {int height = parentView.findViewById(R.id.ll_bottom).getTop();int y = (int) event.getY();if (event.getAction() == MotionEvent.ACTION_UP) {if (y > height) {dismiss();}}return true;}});update();viewTop = parentView.findViewById(R.id.view_line1);tvBottom = (TextView) parentView.findViewById(R.id.tv_popwindow_bottom);tvTop = (TextView) parentView.findViewById(R.id.tv_popwindow_first);adapter = new PopWindowAdapter(context,dataList,false);lv.setAdapter(adapter);if (!TextUtils.isEmpty(topText)){tvTop.setVisibility(View.VISIBLE);tvTop.setText(topText);viewTop.setVisibility(View.VISIBLE);}else {tvTop.setVisibility(View.GONE);viewTop.setVisibility(View.GONE);}if (!TextUtils.isEmpty(bottomText)){tvBottom.setVisibility(View.VISIBLE);tvBottom.setText(bottomText);}else {tvBottom.setVisibility(View.GONE);}lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {listener.onPopItemClick(view, i);}});tvBottom.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {bottomListener.onBottomClick();}});}}
2.看一些item的bean
这里我就声明了title和图片的id
package com.hankkin.library;/*** Created by Hankkin on 16/1/25.*/
public class PopBean {private String title;private int icon_res;public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public int getIcon_res() {return icon_res;}public void setIcon_res(int icon_res) {this.icon_res = icon_res;}public PopBean(String title, int icon_res) {this.title = title;this.icon_res = icon_res;}
}
3.自定义adapter适配器
这里面可能要注意的就是item的背景设置,有的是上半部分圆角、有的是下半部分圆角,特殊处理一下
@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder holder;if (view == null) {view = inflater.inflate(R.layout.listview_popwindow_item, null);holder = new ViewHolder();holder.tv_name = (TextView) view.findViewById(R.id.tv_title);holder.v_line = (View) view.findViewById(R.id.v_line);view.setTag(holder);} else {holder = (ViewHolder) view.getTag();}holder.tv_name.setText(dataList.get(i).getTitle());if (dataList.size() - 1 == i) {holder.v_line.setVisibility(View.INVISIBLE);holder.tv_name.setBackground(context.getResources().getDrawable(R.drawable.selector_bottom_half));} else {holder.v_line.setVisibility(View.VISIBLE);holder.tv_name.setBackground(context.getResources().getDrawable(R.drawable.list_gray_item));}return view;}
最后看一下调用
Activity需要实现item接口(OnPopItemClickListener)和底部按钮接口(OnBottomTextviewClickListener)
public void show(View view){List<PopBean> pops = new ArrayList<>();for (int i=0;i<5;i++){PopBean pop = new PopBean("item"+i,0);pops.add(pop);}popWindow = new ListPopWindow(MainActivity.this,this,this,rl,pops,"cancel","title");popWindow.showAtLocation(rl, Gravity.CENTER| Gravity.BOTTOM,0,0);}
最后小编附上github源码地址,小伙伴们可以直接用哦。
https://github.com/Hankkin/ListPopwidowDemo
Android自定义组件之ListPopWindow相关推荐
- android 自定义组件圆形边框
在android开发中,我们经常要自定义组件如TextView等背景或边框为四角圆形. 首先,我们在drawable目录下新建一个xml文件,bg.xml <?xml version=" ...
- android 使用自定义组件,Android自定义组件开发之onMeasure使用
一.自定义组件造成其他组件的隐藏 我们在开发过程中往往现有的组件无法满足我们的需求,所有我们需要去自定义组件来实现我们的需求,在实现的过程中总会有各种问题,这里我们讨论一下onMeasure的使用,首 ...
- Android 自定义组件随着手指自动画圆
首先自定义一个View子类: package com.example.androidtest0.myView;import android.content.Context; import androi ...
- Android自定义组件——3D立体旋转控件
BingoIdea 一个3D立体切换的自定义ViewGroup demo,支持横向和纵向滑动翻转. 项目配置 在项目的build.gradle配置 allprojects {repositories ...
- Android自定义组件:一个波浪形的组件
自定义一个波浪形的组件 Android 最近公司需要做几个组件,然后就顺便搞一下这个的博客,其实自定义view的话相对来说掌握了核心的几个方法,还是比较简单.我们先来看看我们要做的 效果图: 1.首先 ...
- android自定义组件属性,android自定义控件并添加属性的方法以及示例
安卓系统为我们提供了丰富的控件,但是在实际项目中我们仍然需要重新通过布局来实现一些效果,比如我们需要一个上面图标,下面文字的button,类似于下面这样的: 最直接的解决办法是通过将imageview ...
- android自定义组件属性,Android组合控件详解 自定义属性
组合控件详解 & 自定义属性 组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件. 在实际项目中,GUI 会遇到一些可以提取出来做成自定义控件情况. 一个自定义控件 ...
- Android自定义组件
http://developer.android.com/guide/topics/ui/custom-components.html 下面的表格给出了实现一个具体View要重写的方法. Creati ...
- Android自定义组件之简单组合
Android自定义控件有两种,一种是组合.比如一个linearlayout 里面有textview,imageview. 这样的好处是,写一个就可以多处使用. view_image_and_butt ...
最新文章
- 一个有价值的 Sharepoint WebPart 页签部件
- Serious Python
- 20162316刘诚昊 《程序设计与数据结构》 第三周学习总结
- 多媒体技术 PI 第一期:OSS 圆桌预告
- 零基础学前端之css3高级特效
- C++类构造函数与析构函数
- 仿minecraft游戏 linux,【图片】【Codea制作仿MineCraft3D游戏】Craft Ver. 0.1发布(开源)【codea吧】_百度贴吧...
- 2011年4月51CTO壁纸点评活动获奖名单【已结束】
- 【BZOJ3622】已经没有什么好害怕的了,两次DP
- 爱奇艺发布新款电视果,AI 语音控制,4G、WiFi 双模式投屏!
- slice 和splice 的区别 js
- layui-treeTable v2.0添加搜索功能
- APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法
- 吉林大学超星学习通05
- 支持向量回归(SVR)的详细介绍以及推导算法
- 女程序员未来的职场出路在哪里?
- 解析改变测试自动化的协作机器人
- 转:激励,如何做更有效
- pip 安装keystone_基于Ubuntu12.04下的Keystone源码安装
- ISDN:综合业务数字网--网络大典
热门文章
- 卸载 Ubuntu 16.04 Kinetic版本ROS
- WR703N烧写openwrt全过程
- 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题办法最全汇总
- 如何在Anaconda创建新环境
- filecoin lotus 图形化测试平台pond
- 什么是IP?什么是DN/DNS?什么是hosts文件?计算机访问网络的原理又是怎样的?
- Mac批量复制文件名
- 王岚老师计算机,平凡中演绎精彩——优秀教师王岚
- 失传千年AE特效真经(一)
- 多米诺红光管激光机,为覆膜纸盒、药盒提供完美不起泡的标识打码解决方