首先来看一下实现的效果

基本思路:继承PopupWindow的自定义View

说明:下图这部分自己布局,本文中主要说明的是点击某个分类显示的下拉实现

第一步:自定义 SpinnerPopuwindow继承PopupWindow


/*** Created by sws on 2019-04-28.* from:* describe:*/public class SpinnerPopuwindow extends PopupWindow {private View conentView;private ListView listView;private SpinnerPopAdapter adapter;private Activity context;private TextView pop_title;private TextView pop_cancel;/*** @param context 上下文* @param string 获取到未打开列表时显示的值* @param list 需要显示的列表的集合* @param itemsOnClick listview在activity中的点击监听事件*/@SuppressLint("InflateParams")public SpinnerPopuwindow(final Activity context, final String string, final List<String> list, AdapterView.OnItemClickListener itemsOnClick) {LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);this.context =context;conentView = inflater.inflate(R.layout.popuwindow_spinner, null);// 设置SelectPicPopupWindow的Viewthis.setContentView(conentView);// 设置SelectPicPopupWindow弹出窗体的宽this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);//    this.setWidth(view.getWidth());// 设置SelectPicPopupWindow弹出窗体的高this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);// 设置SelectPicPopupWindow弹出窗体可点击this.setFocusable(true);// 刷新状态this.update();this.setOutsideTouchable(false);// 实例化一个ColorDrawable颜色为半透明ColorDrawable dw = new ColorDrawable(0000000000);// 点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener ,设置其他控件变化等操作this.setBackgroundDrawable(dw);this.setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss() {darkenBackground(1f);}});//解决软键盘挡住弹窗问题this.setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);// 设置SelectPicPopupWindow弹出窗体动画效果//  this.setAnimationStyle(R.style.AnimationPreview);adapter = new SpinnerPopAdapter(context,list);listView = (ListView) conentView.findViewById(R.id.listView);listView.setOnItemClickListener(itemsOnClick);listView.setAdapter(adapter);// setAdapter是异步进行的,为了使弹窗能即时刷新,所以使用post+RunnablelistView.post(new Runnable() {@Overridepublic void run() {//主要是为了比对未打开列表时显示的值和列表中的值进行默认选中for(int j = 0;j<list.size();j++){if(string.equals(list.get(j).toString())){listView.setItemChecked(j, true);//listview自带的方法}else {listView.setItemChecked(j, false);}}}});pop_title = (TextView) conentView.findViewById(R.id.pop_title);
//        pop_cancel = (TextView) conentView.findViewById(R.id.pop_cancel);
//
//        pop_cancel.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                dismiss();
//                darkenBackground(1f);
//            }
//        });}//给下拉列表的设置标题,增加复用性public void setTitleText(String str){pop_title.setText(str);}//获取选中列表中的数据所对应的positionpublic int getText(){return listView.getCheckedItemPosition();}/*** 显示popupWindow** @param parent*/public void showPopupWindow(View parent) {if (!this.isShowing()) {// 以下拉方式显示popupwindowthis.showAsDropDown(parent);
//             this.showAsDropDown(parent,0,10);
//            this.showAtLocation(parent, Gravity.BOTTOM|Gravity.CENTER, 0, 0);darkenBackground(0.9f);//弹出时让页面背景回复给原来的颜色降低透明度,让背景看起来变成灰色}}/*** 关闭popupWindow*/public void dismissPopupWindow() {this.dismiss();darkenBackground(1f);//关闭时让页面背景回复为原来的颜色}/*** 改变背景颜色,主要是在PopupWindow弹出时背景变化,通过透明度设置*/private void darkenBackground(Float bgcolor){WindowManager.LayoutParams lp = context.getWindow().getAttributes();lp.alpha = bgcolor;context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);context.getWindow().setAttributes(lp);}
}

本类中主要是创建一个PopupWindow,并编写他的显示、关闭,点击监听,设置标题等方法,你可以按照你的需求更改背景颜色、弹出窗体的宽高等。

需要用到的列表布局如下 :一个简单的listview和标题TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"><TextViewandroid:id="@+id/pop_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="6dp"android:gravity="center"android:textSize="@dimen/text14"/><Viewandroid:layout_width="match_parent"android:layout_height="0.5dp"android:background="@color/hui"/><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="#00000000"android:choiceMode="singleChoice"></ListView>
</LinearLayout>

第二步:在要使用下拉列表的Activity中创建

/** 项目类型数据*/
private List<String> lxData;private SpinnerPopuwindow lxSpinnerPopuwindow;//在页面上项目类型按钮的点击监听中加一下代码type_lx = tvlx.getText().toString();lxSpinnerPopuwindow = new SpinnerPopuwindow( StreetDeviceListActivity.this,type_lx,lxData,lxitemsOnClick);
//type_lx:选择某一项后显示选中内容的TextViewlxSpinnerPopuwindow.showPopupWindow(llSX);//llSX是指此下拉列表要显示在那个view下边lxSpinnerPopuwindow.setTitleText("项目类型");//给下拉列表设置标题

第三步:为下拉列表设置监听

 private AdapterView.OnItemClickListener lxitemsOnClick = new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {String value = lxData.get(lxSpinnerPopuwindow.getText());tvlx.setText(value);lxSpinnerPopuwindow.dismissPopupWindow();//TODO 这儿写点击某一项之后你要执行的代码}};

Android 下拉选择框自定义view相关推荐

  1. android——下拉选择框(自定义spinner)

    相信大家都有遇到下拉选择这个功能,接下来我把我学习的给大家分享一下. 一.导入依赖 implementation 'com.github.arcadefire:nice-spinner:1.4.4' ...

  2. 自定义组合控件:下拉选择框

    Spinner 自定义组合控件之下拉选择框 项目概述 下拉选择框主要是通过在EditText 下用PopupWindow 动态显示ListView 控件来实现的.下拉选择框可以方便用户的输入效率,以此 ...

  3. html下拉选择框箭头改为年,CSS自定义select下拉选择框的样式(不用其他标签模拟)...

    今天群里有人问到怎么自定义select下拉选择框的样式,于是群里就展开了激烈的讨论,刚开始一直就是考虑怎样使用纯CSS实现,把浏览器默认的样式覆盖掉,但最后均因兼容问题处理不好而失败告终,最后的解决方 ...

  4. 微信小程序自定义下拉选择框与分页加载--自用【随笔】

    效果图展示 下拉加载 上拉加载 编码实现 wxml <!--pages/unitmanage/unitlease/unitlease.wxml--> <view><vie ...

  5. 自定义html下拉选择框,CSS自定义select下拉选择框的样式(不用其他标签模拟)

    今天群里有人问到怎么自定义select下拉选择框的样式,于是群里就展开了激烈的讨论,刚开始一直就是考虑怎样使用纯CSS实现,把浏览器默认的样式覆盖掉,但最后均因兼容问题处理不好而失败告终,最后的解决方 ...

  6. 类似QQ登陆界面保存密码和账号下拉选择框

    本界面的效果 需要的知识 PopupWindon ListView的内部响应事件 分析 步骤 ListView PopupWindow 点击事件 用户信息存储 GSON 的用法 实施方案 情况一 情况 ...

  7. Android下拉选择弹窗

    起因呢又是有个需求,也是自己觉得好看,很多app都有下拉选择框,就想着实现下(主要是时间空闲,如果时间少,项目急,就找现成的),先看图片: 直接上代码: xml: <com.yinp.proap ...

  8. UI标签库专题十一:JEECG智能开发平台 DictSelect (数据字典下拉选择框)

     1. DictSelect (数据字典下拉选择框) 1.1. 参数 属性名 类型 描述 是否必须 默认值 typeGroupCode string 字典分组编码 是 null field str ...

  9. QComboBox下拉选择框

    QComboBox简介 QComboBox 是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个 QLineEdit 用作输入. QComboBox 除了显示可见下拉列表外,每个项(i ...

最新文章

  1. 解读|智能技术“核聚变”催生智能经济,将拉动十万亿市场
  2. ExtJS(3)- 自定义组件(星级评分)
  3. 这家芯片公司98%员工学历不足本科,却要布局全产业链冲刺IPO,网友:认真的吗?...
  4. 使用调用者权限实现Schema导向操作
  5. 学好python薪水有多少笔画_Python学到什么程度可以面试工作?
  6. 2017.9.27 可持久化并查集 失败总结
  7. SpringCloud工作笔记102---苞米豆mybitis增强工具
  8. Go编程语言能干什么
  9. 多任务学习Multi-task Learning(MTL)概述
  10. virtualbox 搭建opnsense 防火墙
  11. 【图像超分辨率】Deep Learning for Image Super-resolution: A Survey
  12. 机器学习中常见知识点总结
  13. 盘点无线互联网战国七雄
  14. 异常:org.hibernate.cache.NoCachingEnabledException: Second-level cache is not enabled for usage [hiber
  15. XUL 用户界面语言介绍
  16. 养牛和养羊相比,用同样的资金,哪个效益会更高一些?
  17. [每天读一点英文:那些给我勇气的句子]George Soros—the financial crocodile
  18. 步进电机及驱动芯片选型指南
  19. ESP8266 NodeMCU开发板
  20. 利用adb指令为IPTV盒子安装应用

热门文章

  1. Selenium 爬取评论数据,就是这么简单!
  2. 致批驳哥德尔不完全性定理者
  3. 哥德尔递归汉译和原始递归——哥德尔原著英译拆解汉译之七
  4. 微信公众号开发整理(四)--音乐消息回复
  5. token - 令牌
  6. 通过文献计量学助您发表高影响因子论文—基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法
  7. algoc++之求解根号2
  8. office修复找不到msi_office2013安装出错,老是出现找不到officeMUI.msi或则officeMUI.xml等,是什么原 - Microsoft Community...
  9. 半阳不阳后的一些总结
  10. html 控制横向打印机,hp LaserJet 1000打印机怎么设置实现横向打印?