Android 简单的下拉选择框实现

要实现这种效果,目前知道的方法有以下两种,Spinner 和  ListPopupWindow,当然肯定还有很多别的方法,这里我们先尝试使用ListPopupWindow来实现这个效果;

以下是一个简单的demo:

public class MainActivity extends AppCompatActivity {private List<String> dataList;private ListPopupWindow listPopupWindow;private Button showPopupButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();// 初始化 ListPopupWindowlistPopupWindow = new ListPopupWindow(this);ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);listPopupWindow.setAdapter(adapter);listPopupWindow.setAnchorView(showPopupButton); // 设置锚点// 设置列表项点击监听器listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {String selectedItem = dataList.get(position);Toast.makeText(MainActivity.this, "Selected: " + selectedItem, Toast.LENGTH_SHORT).show();listPopupWindow.dismiss(); // 点击后隐藏 ListPopupWindow}});// 初始化显示下拉选择框的按钮showPopupButton = findViewById(R.id.show_popup_button);showPopupButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listPopupWindow.show(); // 点击按钮显示 ListPopupWindow}});}private void initData() {// 模拟数据dataList = new ArrayList<>();dataList.add("Option 1");dataList.add("Option 2");dataList.add("Option 3");// 添加更多选项...}
}

在这个示例中,我们创建了一个包含几个选项的数据列表 dataList,然后使用 ArrayAdapter 将它们设置到 ListPopupWindow 中。接着,我们为 ListPopupWindow 设置了一个按钮作为锚点,并设置了按钮的点击监听器,在点击按钮时显示 ListPopupWindow。最后,我们为 ListPopupWindow 设置了一个列表项点击监听器,在用户点击列表项时处理相应的逻辑,并隐藏 ListPopupWindow

确保您的布局文件中包含一个按钮控件(Button),用于触发显示 ListPopupWindow 的操作。

以上只是一个简单的demo,我们可能会遇到一些新的需求,如下

如果已经选中了某个选项,并且更新了按钮的文本为选中的选项内容,当再次点击按钮显示下拉选择框时,您可以让下拉框中的列表项与按钮内容匹配,并将匹配项显示为选中状态。

下面是一种实现方式:

public class MainActivity extends AppCompatActivity {private List<String> dataList;private ListPopupWindow listPopupWindow;private Button showPopupButton;private String selectedItem;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();// 初始化 ListPopupWindowlistPopupWindow = new ListPopupWindow(this);ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);listPopupWindow.setAdapter(adapter);listPopupWindow.setAnchorView(showPopupButton); // 设置锚点// 设置列表项点击监听器listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {selectedItem = dataList.get(position);showPopupButton.setText(selectedItem); // 更新按钮文本为选中的选项内容Toast.makeText(MainActivity.this, "Selected: " + selectedItem, Toast.LENGTH_SHORT).show();adapter.notifyDataSetChanged(); // 刷新适配器以更新选中状态listPopupWindow.dismiss(); // 点击后隐藏 ListPopupWindow}});// 初始化显示下拉选择框的按钮showPopupButton = findViewById(R.id.show_popup_button);showPopupButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listPopupWindow.show(); // 点击按钮显示 ListPopupWindow// 选中当前按钮文本所对应的选项int index = dataList.indexOf(showPopupButton.getText().toString());listPopupWindow.setSelection(index);}});}private void initData() {// 模拟数据dataList = new ArrayList<>();dataList.add("Option 1");dataList.add("Option 2");dataList.add("Option 3");// 添加更多选项...}
}

在这个示例中,我们在点击按钮时设置了下拉框中的选项为当前按钮的文本对应的选项,并通过 listPopupWindow.setSelection(index) 方法来实现。这样,下拉框中的选项就会显示为选中状态。

我们继续:listPopupWindow.setSelection(index) 的话,如果每个index 的选中效果不一样应该怎么处理呢?

如果每个选项的选中状态效果不一样,可以在适配器中根据选中状态来设置不同的样式。在 getView() 方法中,可以根据每个选项的选中状态来设置其样式,以反映其选中状态。

下面是一个修改后的示例代码,演示如何根据每个选项的选中状态来设置不同的样式:

public class MainActivity extends AppCompatActivity {private List<String> dataList;private List<Boolean> itemSelectedStates;private ListPopupWindow listPopupWindow;private Button showPopupButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化数据initData();// 初始化 ListPopupWindowlistPopupWindow = new ListPopupWindow(this);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 0, dataList) {@Overridepublic View getView(int position, View convertView, android.view.ViewGroup parent) {// 获取当前选项的视图View view = super.getView(position, convertView, parent);TextView textView = (TextView) view;// 设置选项的样式if (itemSelectedStates.get(position)) {// 如果选项被选中,设置为粗体字体,背景色为灰色textView.setAllCaps(true);textView.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));} else {// 如果选项未选中,恢复普通字体样式,背景色为白色textView.setAllCaps(false);textView.setBackgroundColor(getResources().getColor(android.R.color.white));}return view;}};listPopupWindow.setAdapter(adapter);listPopupWindow.setAnchorView(showPopupButton); // 设置锚点// 设置列表项点击监听器listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {String selectedItem = dataList.get(position);Toast.makeText(MainActivity.this, "Selected: " + selectedItem, Toast.LENGTH_SHORT).show();// 更新选中状态数组for (int i = 0; i < itemSelectedStates.size(); i++) {itemSelectedStates.set(i, (i == position));}adapter.notifyDataSetChanged(); // 刷新适配器以更新选中状态listPopupWindow.dismiss(); // 点击后隐藏 ListPopupWindow}});// 初始化显示下拉选择框的按钮showPopupButton = findViewById(R.id.show_popup_button);showPopupButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {listPopupWindow.show(); // 点击按钮显示 ListPopupWindow}});}private void initData() {// 模拟数据dataList = new ArrayList<>();dataList.add("Option 1");dataList.add("Option 2");dataList.add("Option 3");// 添加更多选项...// 初始化选中状态数组,默认第一个选项为选中状态itemSelectedStates = new ArrayList<>();for (int i = 0; i < dataList.size(); i++) {itemSelectedStates.add(false);}}
}

在这个示例中,我们重写了 ArrayAdaptergetView() 方法,在其中根据每个选项的选中状态来设置不同的样式。当选项被选中时,我们将其字体设置为粗体并将背景色设为灰色,未选中时恢复普通字体样式并将背景色设为白色。这样可以让每个选项的选中状态效果不一样。

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

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

相关文章

QueryPerformanceCounter实现高精度uS(微妙)延时

参考连接 C# 利用Kernel32的QueryPerformanceCounter封装的 高精度定时器Timer_kernel32.dll queryperformancecounter-CSDN博客https://blog.csdn.net/wuyuander/article/details/111831973 特此记录 anlog 2024年5月11日

ubuntu安装oceanbase调通本地navicat链接

分为两部分 一安装oceanbase服务 准备工作 mkdir -p /data/1 /data/log1 chown -R admin.admin /data/1 /data/log1/偷偷说&#xff1a;其实这步我忘记执行&#xff0c;也没影响我安装 oceanbase程序是很占内存的在安装时我们要先下载好安装包&#xff1a; 然后放在能记住的…

【C语言】/*操作符(上)*/

目录 一、算数操作符&#xff1a;、-、*、/、% 1.1 和 - 1.2 * 1.3 / 1.4 % 二、赋值操作符&#xff1a; 和符合赋值 2.1 连续赋值 2.2 复合赋值(自操作) 三、单目操作符&#xff1a;、--、(正号)、-(负号) 3.1 和 -- 3.1.1 前置 3.1.2 后置 3.1.3 前置-- …

稳定网络的诀窍:静态住宅代理解决方案

在数字化时代&#xff0c;网络稳定性对于个人和企业都至关重要。然而&#xff0c;由于多种因素的影响&#xff0c;如地理位置、网络拥堵或网络安全问题等&#xff0c;网络稳定性常常受到挑战。为了应对这些挑战&#xff0c;静态住宅代理作为一种高效且可靠的网络解决方案&#…

C++容器——list

目录 list容器 list容器使用流程 加入头文件 定义 list容器的使用 添加元素&#xff1a; 删除元素&#xff1a; 访问元素&#xff1a; 容器大小&#xff1a; 迭代器操作&#xff1a; 其他操作&#xff1a; list容器 功能&#xff1a;将数据进行链式存储 链表(list…

kali linux2024.1版安装

1 基于 VMware 安装 Kali 系统 打开已经安装好的 VMware 程序&#xff0c;点击选项卡中的“主页”--》而后点击“创建新的虚拟机” 选择“典型(推荐)”&#xff0c;并点击“下一步” 客户机操作系统镜像选择&#xff1a;选择“稍后安装操作系统”&#xff0c;并点击“下一步”…

《中阿科技论坛(中英文)》是什么级别的期刊?是正规期刊吗?

问题解答 问&#xff1a;《中阿科技论坛&#xff08;中英文&#xff09;》是核心期刊吗&#xff1f; 答&#xff1a;不是&#xff0c;但是正规期刊 问&#xff1a;《中阿科技论坛&#xff08;中英文&#xff09;》是什么级别期刊&#xff1f; 答&#xff1a;省级 主管单位…

转转小程序数据处理

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872&#xff0c;x30184483x…

BUU-[GXYCTF2019]Ping Ping Ping

考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示&#xff0c;那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞&#xff0c;测试?ip127.0.…

dos命令改3389端口,通过dos命令更改3389端口的操作

要使用DOS命令更改3389端口&#xff0c;通常涉及修改Windows注册表中的相关键值。请注意&#xff0c;直接操作注册表具有一定的风险&#xff0c;因此在进行任何更改之前&#xff0c;请确保您了解正在进行的操作&#xff0c;并已经采取了适当的备份措施。 以下是一个基本的操作步…

记录一次接口优化的过程。接口响应时间从500s下降到5s。

记录一次接口优化的过程。接口响应时间从500s下降到5s。 接口说明&#xff1a; 该接口通过用户导入的一年内每天的厂区用电功率数据来计算用户安装储能设备后的收益情况。 用电功率数据具体为每15分钟一条&#xff0c;一年约有 12*30*24*4 34560 条。 代码循环情况为&…

详解GaussDB(DWS)中的行执行引擎

1.前言 GaussDB&#xff08;DWS&#xff09;包含三大引擎&#xff0c;一是SQL执行引擎&#xff0c;用来解析用户输入的SQL语句&#xff0c;生成执行计划&#xff0c;供执行引擎来执行&#xff1b;二是执行引擎&#xff0c;其中包含了行执行引擎和列执行引擎&#xff0c;执行引擎…

当时这样说就好了的笔记

系列文章目录 当时这样说就好了的笔记 文章目录 系列文章目录一、 不用好口才&#xff0c;怎么谈都讨喜的“说话金律”1、 掌握对方爱聊什么是交谈热络的第一步2、 装笨让对方当主角&#xff0c;和谁都能聊不停3、 “讲道理”谁都怕&#xff0c;坚持己见最伤感情4、 懂“聆听附…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 04 (完结)

Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Neural Networks and Deep LearningWeek 04: Deep Neural NetworksLearning Objectives Deep L-layer…

mac第三方软件怎么删除 MacBook卸载第三方应用程序 mac第三方恶意软件删除不了怎么办呢

Mac是一款优秀的个人电脑&#xff0c;它拥有流畅的操作系统、强大的性能和丰富的应用程序。但是&#xff0c;随着使用时间的增加&#xff0c;你可能会发现你的Mac上安装了一些不需要或者不喜欢的第三方软件&#xff0c;这些软件可能会占用你的空间、影响你的速度或者带来安全风…

MahApps.Metro的MVVM模式介绍(一)

MahApps.Metro是一个开源的WPF (Windows Presentation Foundation) UI 控件库。它的特点有现代化设计、主题定制、响应式布局、内置控件。 而Mvvm模式的核心思想是将用户界面&#xff08;View&#xff09;与应用程序逻辑&#xff08;ViewModel&#xff09;分离&#xff0c;以实…

电商大数据的采集||电商大数据关键技术【基于Python】

.电商大数据采集API 什么是大数据&#xff1f; 1.大数据的概念 大数据即字面意思&#xff0c;大量数据。那么这个数据量大到多少才算大数据喃&#xff1f;通常&#xff0c;当数据量达到TB乃至PB级别时&#xff0c;传统的关系型数据库在处理能力、存储效率或查询性能上可能会遇…

设计模式-创建型-原型模式-prototype

工作经验类 public class WorkExperience implements Cloneable {private String workDate;private String company;public void setWorkDate(String workDate) {this.workDate workDate;}public void setCompany(String company) {this.company company;}Overridepublic Ob…

GAME101-Lecture06学习

前言 上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。 这节课主要就是反走样。 课程链接&#xff1a;Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili 反走样引入 ​ 通过采样&#xff0c;得到…

算法设计与分析 例题解答 解空间与搜索

1.请画出用回溯法解n3的0-1背包问题的解空间树和当三个物品的重量为{20, 15, 10}&#xff0c;价值为{20, 30, 25}&#xff0c;背包容量为25时搜索空间树。 答&#xff1a; 解空间树&#xff1a; 搜索空间树&#xff1a; 2. 考虑用分支限界解0-1背包问题 给定n种物品和一背包…