android 自定义下拉框

一、 简介:

      原生Android 提供的spinner下拉框不怎么方便,样式有点丑。修改起来麻烦,于是就自己动手写了一下拉列表。

实现原理使用的是,popwindow弹框,可实现宽高自定义,下拉列表使用listview.

二、pop弹框代码,文件名SpinerPopWindow.java


import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView.OnItemClickListener;
import java.util.List;import csu.xiaoya.robotApp.R;/*** 自定义PopupWindow  ** @param <T>* @param <T>* @author Ansen* @create time*/public class SpinerPopWindow<T> extends PopupWindow {private LayoutInflater inflater;private ListView mListView;private List<T> list;private MyAdapter mAdapter;public SpinerPopWindow(Context context, List<T> list, OnItemClickListener clickListener) {super(context);inflater = LayoutInflater.from(context);this.list = list;init(clickListener);}private void init(OnItemClickListener clickListener) {View view = inflater.inflate(R.layout.spiner_window_layout, null);setContentView(view);setWidth(LayoutParams.WRAP_CONTENT);setHeight(LayoutParams.WRAP_CONTENT);setFocusable(true);ColorDrawable dw = new ColorDrawable(0x00);setBackgroundDrawable(dw);mListView = (ListView) view.findViewById(R.id.listview);mListView.setAdapter(mAdapter = new MyAdapter());mListView.setOnItemClickListener(clickListener);}private class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = inflater.inflate(R.layout.spiner_item_layout, null);holder.tvName = (TextView) convertView.findViewById(R.id.tv_name);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.tvName.setText(getItem(position).toString());return convertView;}}private class ViewHolder {private TextView tvName;}
}


三、spiner_window_layout布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:background="@color/dwupBgColor"android:orientation="vertical"><ListViewandroid:id="@+id/listview"android:layout_width="fill_parent"android:layout_height="wrap_content"android:cacheColorHint="#00000000"android:background="@color/dwupBgColor"android:scrollbars="none" ></ListView>
</LinearLayout>

四、spiner_item_layout子布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="@dimen/dp_23"android:gravity="center_vertical"><TextViewandroid:id="@+id/tv_name"android:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="@dimen/dp_15"android:paddingTop="@dimen/dp_8"android:paddingRight="@dimen/dp_10"android:paddingBottom="@dimen/dp_8"android:text="fdsfdsfdsf"android:textColor="@color/white"android:textSize="10sp" /></LinearLayout>

五、使用

    //调用@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);initSpinnerList();}

六、对应方法

/****/private SpinerPopWindow<String> mSpinerPrincePopWindow;//省private List<String> list;//省private TextView tvValue;private void initSpinnerList() {initData();tvValue = (TextView) findViewById(R.id.tv_province);tvValue.setOnClickListener(clickListener);// 省mSpinerPrincePopWindow = new SpinerPopWindow<String>(this, list, itemClickListener);mSpinerPrincePopWindow.setOnDismissListener(dismissListener);}/*** 监听popupwindow取消*/private OnDismissListener dismissListener = new OnDismissListener() {@Overridepublic void onDismiss() {setTextImage(R.drawable.dw_arrow, mDataBinding.tvProvince);}};/*** popupwindow显示的ListView的item点击事件*/private OnItemClickListener itemClickListener = new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {mSpinerPrincePopWindow.dismiss();tvValue.setText(list.get(position));}};/*** 显示PopupWindow*/private OnClickListener clickListener = new OnClickListener() {@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_province://省mSpinerPrincePopWindow.setWidth(tvValue.getWidth());mSpinerPrincePopWindow.showAsDropDown(tvValue);setTextImage(R.drawable.icon_up, mDataBinding.tvProvince);break;}}};/*** 初始化数据*/private void initData() {list = new ArrayList<String>();//省list.add("北京");list.add("上海");list.add("浙江");list.add("广东");list.add("江苏");list.add("湖南");list.add("湖北");list.add("四川");list.add("陕西");}

七、shape_help_category_tv_bg外形布局

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><!-- 填充的颜色 --><solid android:color="#ff2e2f43" /><corners android:radius="5dp" /><!-- 设置边框 --><strokeandroid:width="1dp"android:color="#ff2e2f43" />
</shape>

八、shape_popupwindow_list_bg

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" ><!-- This is the main color --><item><shape><!-- 边框颜色 --><solid android:color="@color/gray"/></shape></item><!-- 给View的上 左  右设置8dp的边框 --><itemandroid:left="1dp"android:right="1dp"android:bottom="1dp"><shape><!-- View填充颜色 --><solid android:color="@color/white"/></shape></item></layer-list>

九、完结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型基础架构的变革:剖析Transformer的挑战者(中)

上一篇文章中&#xff0c;我们介绍了RetNet、RWKV、Mamba等有可能会替代Transformer的模型架构&#xff0c;这一篇文章我们将要介绍另外三个有可能会替代Transformer的模型架构&#xff0c;它们分别是UniRepLKNet、StripedHyena、PanGu-π&#xff0c;想了解之前的内容&#xf…

vue项目改造服务端渲染

vue项目改造服务端渲染 概述 【定义】 服务器渲染的Vue应用程序被认为是"同构"或"通用"&#xff0c;因为应用程序的大部分代码都可以在服务器和客户端上运行 【优点】 与传统SPA相比&#xff0c;服务器端渲染(SSR)的优势主要在于&#xff1a; 1、更好的…

二叉树-堆应用(1)

目录 堆排序 整体思路 代码实现 Q1建大堆/小堆 Q2数据个数和下标 TopK问题 整体思路 代码实现 Q1造数据CreateData Q2建大堆/小堆 建堆的两种方法这里会用到前面的向上/向下调整/交换函数。向上调整&向下调整算法-CSDN博客 堆排序 整体思路 建堆&#xff08;直…

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(三)

1.QSet: toList 中的toList 函数已不存在&#xff0c;遇到xx->toList改成直接用&#xff0c;如下&#xff1a; 2.开源QWT 图形库中QwtDial中的 setPenWidth 变成 setPenWidthF函数。 3.QDateTime 中无setTime_t 改为了setSecsSinceEpoch函数。 4.QRegExp 类已不存在 可以用Q…

【定位·HTML】

定位布局可以分为以下四种&#xff1a; 静态定位&#xff08;inherit&#xff09; 相对定位&#xff08;relative&#xff09; 绝对定位&#xff08;absolute&#xff09; 固定定位&#xff08;fixed&#xff09; 一般的标签元素不加任何定位属性时&#xff0c;默认都属于静态…

百川终入海 ,一站式海量数据迁移工具 X2Doris 正式发布

在大数据分析领域&#xff0c;Apache Doris 作为广受认可的开源实时数据仓库&#xff0c;已经在越来越多行业用户的真实业务场景中得到广泛应用&#xff0c;成为许多企业数据分析基础设施的重要基座。尤其在过去一年多的时间里&#xff0c;越来越多企业选择基于 Apache Doris 进…

node.js(nest.js控制器)学习笔记

nest.js控制器&#xff1a; 控制器负责处理传入请求并向客户端返回响应。 为了创建基本控制器&#xff0c;我们使用类和装饰器。装饰器将类与所需的元数据相关联&#xff0c;并使 Nest 能够创建路由映射&#xff08;将请求绑定到相应的控制器&#xff09;。 1.获取get请求传参…

牛客——中位数图(连续子数组和二维前缀和)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给出1~n的一个排列&#xff0c;统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后&#xff0c;位于中间的数。 输入描述: 第一行为两个正…

CentOS gui 图形界面显示文字乱码

一、现象 CentOS&#xff08;CentOS 7.5&#xff09;控制台下显示中文乱码&#xff1a; 或者通过X11 Forwarding远程显示CentOS的图形化程序文字乱码&#xff1a; 二、解决方法 安装中文语言包&#xff1a; yum install kde-l10n-Chinese 注&#xff1a;网上有些文章会推荐安…

Linux文本三剑客---grep经典案例

grep&#xff08;从文本或字符串种过滤特定内容。&#xff09; 格式&#xff1a;Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项&#xff1a; -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…

如何采集京东的商品-简数采集器

如何使用简数采集器批量采集京东的商品及相关描述呢&#xff1f; 简数采集器目前不支持采集京东的商品及相关信息&#xff0c;且不建议采集&#xff0c;请换个采集源采集。 简数采集器采集网页文章特别简单方便&#xff0c;不需要懂代码写采集规则的&#xff0c;只需输入要采…

【解刊】审稿人极其友好!中科院2区SCI,3个月录用,论文质量要求宽松!

计算机类 • 高分快刊 今天带来Springer旗下计算机领域高分快刊&#xff0c;有投稿经验作者表示期刊审稿人非常友好&#xff0c;具体情况一起来看看下文解析。如有投稿意向可重点关注&#xff1a; 01 期刊简介 Complex & Intelligent Systems ✅出版社&#xff1a;Sprin…

上岸秘籍来啦!TOGAF认证考试全攻略

上岸秘籍来啦&#xff01;手把手教你如何顺利通过TOGAF认证考试&#xff01; &#x1f31f;考试内容 TOGAF 9.2认证分为两个级别&#xff1a; ✅ TOGAF基础级&#xff1a;掌握标准术语、结构和基本概念&#xff0c;理解企业架构和核心标准。 ✅ TOGAF鉴定级&#xff1a;深入分析…

【知识点】设计模式

创建型 单例模式 Singleton&#xff1a;确保一个类只有一个实例&#xff0c;并提供该实例的全局访问点 使用一个私有构造方法、一个私有静态变量以及一个公有静态方法来实现。私有构造方法确保了不能通过构造方法来创建对象实例&#xff0c;只能通过公有静态方法返回唯一的私…

qt学习:Table widget控件

目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习&#xff1a;QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍&#xff0c;可以双击…

UE5/UE4中3D汉字字体文字的创建与实现

本案例工程下载位置&#xff1a;https://mbd.pub/o/bread/ZZqVmJ9v 在虚幻引擎5&#xff08;UE5&#xff09;和虚幻引擎4&#xff08;UE4&#xff09;中&#xff0c;实现3D汉字字体的创建是一项常见的需求。 本文将详细介绍两种有效的方法&#xff1a; 1.通过TextRender配合Of…

《区块链简易速速上手小册》第9章:区块链的法律与监管(2024 最新版)

文章目录 9.1 法律框架和挑战9.1.1 基础知识9.1.2 主要案例&#xff1a;加密货币的监管9.1.3 拓展案例 1&#xff1a;跨国数据隐私和合规性9.1.4 拓展案例 2&#xff1a;智能合约的法律挑战 9.2 区块链的合规性问题9.2.1 基础知识9.2.2 主要案例&#xff1a;加密货币交易所的合…

DevOps落地笔记-03|用户故事:对用户需求达成共识的关键

上一讲主要跟你介绍了如何使用影响地图这个工具来进行产品定义、里程碑规划和用户需求分析。影响地图让我们始终以达到目标为核心&#xff0c;并让功能和需求不偏离该目标&#xff0c;从而让交付更有重点。可视化、结构化的思维导图为技术和业务人员创建了共享的整体视图&#…

769933-15-5,Biotin aniline,可以合成多种有机化合物和聚合物

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;769933-15-5&#xff0c;Biotin aniline&#xff0c;生物素苯胺&#xff0c;生物素-苯胺 一、基本信息 产品简介&#xff1a;Biotin Aniline&#xff0c;一种具有重要生物学功能的化合物&#xff0c;不仅参与了维生…

Docker多节点部署Minio分布式文件系统并测试

文章目录 一、前提准备二、文件配置1. .env2. env/minio.env3. docker-compose-minio.yml 三、测试四、Java测试1. 引入依赖2. 增删改 一、前提准备 准备如下文件夹和文件 ./ ├── docker-compose-minio.yml ├── .env ├── env │ ├── minio.env ├── minio │…