Android 自定义PopupWindow 实现 ListView与PopupWindow结合下拉框
发布日期:2021-07-30 03:26:03 浏览次数:5 分类:技术文章

本文共 3823 字,大约阅读时间需要 12 分钟。

转载请标明出处:

1.说明

1.1 项目中要求用下拉框弹出一个带有listView的选择框,开始想到spinner来实现,但是那个效果着实不好看,后来用PopupWindow,加listView的布局文件来实现,但是使用的地方多了,就想着把他们弄到一个控件里面,免得麻烦。最后效果如下,用法和PopupWindow一样。Android菜鸟一枚,请大神们指教。

2.效果图

这里写图片描述

3.自定义

3.1 定义效果:显示由上向下,消失由下向上。在anim中定义两个动画。

popupwindow_show:

popupwindow_gone:

在style.xml中引用定义的动画:

3.2 定义控件:

第一步:定义ListViewPopuWindow继承自PopupWindow;
接着定义一个ListView

listView = new ListView(mContext); listView.setSelector(R.drawable.listview_item_selector); listView.setCacheColorHint(Color.TRANSPARENT); listView.setVerticalScrollBarEnabled(false); listView.setDivider(new ColorDrawable(Color.parseColor("#caced1"))); listView.setDividerHeight(2);

有listView,那么adapter肯定不能少的。这里adapter没什么好说的。要说的adapter中的getView方法,这个返回view,没有用布局文件,当然你也可以用布局文件。我们直接用代码生成:

private LinearLayout createSingleView(String name) {            LinearLayout ll = new LinearLayout(mContext);            ll.setBackgroundColor(Color.TRANSPARENT);            ll.setGravity(Gravity.CENTER);            LinearLayout.LayoutParams rlp = new LinearLayout.LayoutParams(                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);            ll.setOrientation(LinearLayout.HORIZONTAL);            TextView tv = new TextView(mContext);            tv.setText(name);            tv.setFocusable(false);            tv.setTextSize(textSize);            tv.setPadding(0, 20, 0, 20);            tv.setTextColor(Color.parseColor(textColor));            ll.addView(tv, rlp);            return ll;        }

接下来在构造方法中设置PopupWindow的一些必要属性和动画:

// 设置SelectPicPopupWindow弹出窗体的宽          this.setWidth(w);          // 设置SelectPicPopupWindow弹出窗体的高          this.setHeight(h);         initView();        this.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.bg_listview_popuwindow_white));        this.setFocusable(true);        this.setOutsideTouchable(true);        this.setContentView(parentLinear);        this.update();        this.setAnimationStyle(R.style.popwin_anim_style);

这里需要注意的是:需要有一个viewGroup来装我们的listView,然后把viewGroup设置到PopupWindow中。这里的viewGroup就是parentLinear,也可以,把listView直接设置到PopupWindow中,我这样做是方便设置背景图片。例如弹框的外形什么的。

其实代码真的没什么难度,很简单的,只是把listview,和adapter放到空间里边去了。现在要做的就是,要实现一个接口。以便于我们在点击item的时候。返回我们想要的信息:

public interface MyClickListener {        void ItemClick(int index, String str);    }    public void setOnMyItemClickListener(MyClickListener listener) {        mYitemClickListener = listener;    }

然后在listView的item点击事件中把信息传出去:

listView.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView
arg0, View arg1, int index, long arg3) { mYitemClickListener.ItemClick(index,mStrings[index]); } });

这里的mStrings是数据源。

3.使用

int[] location = new int[2];        button.getLocationOnScreen(location);        final ListViewPopuWindow popupWindow = new ListViewPopuWindow(                this, tv_state_value, ViewGroup.LayoutParams.MATCH_PARENT,                ViewGroup.LayoutParams.WRAP_CONTENT,0);        popupWindow.setOnMyItemClickListener(new ListViewPopuWindow.MyClickListener() {            @Override            public void ItemClick(int index, String str) {                button.setText(str);                popupWindow.dismiss();            }        });        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {                @Override                public void onDismiss() {                //处理popupWindow消失时处理的事情                }            });    popupWindow.showAtLocation(button, Gravity.NO_GRAVITY,            location[0], location[1] + button.getHeight());

使用的是我们只需要传一个,context,数据源,宽,高,背景图片id。这里宽高可以是ViewGroup.LayoutParams.WRAP_CONTENT。button.getLocationOnScreen(location)是为了拿到显示位置。

到这里就写完了。希望能对人有帮助。不明白的地方可以私信我。
demo下载地址:

转载地址:https://blog.csdn.net/u010886975/article/details/52711611 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android 代码模拟ListView item的点击事件的两种方式
下一篇:Android SharedPreferences 简单封装

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月25日 04时46分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

php+跑buth,php 中函数获取可变参数的方法, 这个语法有点像 golang 语言中的 2019-04-21
cms 单点登录 php,Yii2 中实现单点登录的方法 2019-04-21
oracle自己运行,创建Oracle自动执行Job 2019-04-21
oracle报错00020,oracle启动 ORA-00020: maximum number of processes (%s) exceeded错误 2019-04-21
chmod 赋权所有_chmod 权限 命令详细用法 2019-04-21
html代码翻译_[译]您知道 HTML 的键盘标签吗? 2019-04-21
html抽奖代码_JavaScript高手之路:封装抽奖效果 2019-04-21
hadoop 3.3 一直停留在running wordcount_蛋价持续下跌,今日跌破3.3元大关!深秋季节价格还能反弹吗?... 2019-04-21
的流程图做完后如何保存_2019超火的半永久眉是哪款?做完后我们如何护理?... 2019-04-21
去除logo 高德地图api_深圳品牌logo升级如何保持原型的同时更具创新? 2019-04-21
二重积分转换成极坐标_二重积分转换极坐标r的范围如何确定? 2019-04-21
python中倒背如流_八字基础知识--倒背如流篇 2019-04-21
以太坊地址和公钥_以太坊地址是什么 2019-04-21
linux查看wifi信号命令_linux – 获取WIFI信号强度 – 寻求最佳方式(IOCTL,iwlist(iw)等)... 2019-04-21
npm 不重启 全局安装后_解决修复npm安装全局模块权限的问题 2019-04-21
vs格式化json 不生效_vs code 格式化 json 配置 2019-04-21
go 字符串反序列化成对象数组_Fastjson 1.2.24反序列化漏洞深度分析 2019-04-21
onmessage websocket 收不到信息_WebSocket断开重连解决方案,心跳重连实践 2019-04-21
hibernate mysql 缓存_hibernate和mysql的缓存问题,没辙了! 2019-04-21
abp框架 mysql_ABP框架使用Mysql数据库 2019-04-21