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,一经查实,立即删除!

相关文章

三方库的调用方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言三方库的调用方法1. **下载并安装Boost库(三方库)**2. **配置开发环境**3. **包含Boost(三方库)头文件**4. **编写代码**5. **链接Boost库(三…

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…

AWTK应用程序将资源放到 zip 文件中的方法

在支持文件系统的时候&#xff0c;AWTK 的资源缺省是以独立文件的形式放在指定目录里的。但在有的情况下&#xff0c;把全部资源文件放到一个 zip 文件中&#xff0c;是更好的或唯一的选择。比如&#xff1a; 开发 PC 应用程序。 在没有文件系统的情况下&#xff0c;把资源放到…

【软测学习笔记】Python 教程(1)

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;软件测试笔记 &#x1f4da;参考教程&#xff1a;菜鸟教程❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、Python 简介 二、Python发展历史 三、Python 特点 四、 Python 环…

kali linux2024.1版安装

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

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

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

多线程的情况下 AopContext.currentProxy()切面代理失效问题

多线程的情况下 AopContext.currentProxy()切面代理失效问题 在多线程环境下&#xff0c;AopContext.currentProxy() 可能会遇到问题&#xff0c;特别是在某些情况下&#xff0c;它无法正确地获取到当前线程的代理对象。这通常发生在以下几种情况&#xff1a; 线程不是由Spri…

深度神经网络详解

深度神经网络&#xff08;Deep Neural Network&#xff0c;DNN&#xff09;是机器学习领域中一种重要的人工神经网络。它主要由多层结构组成&#xff0c;通常包括输入层、隐藏层和输出层&#xff0c;每层之间通过权重进行连接。这些权重在训练过程中通过学习来调整&#xff0c;…

Vue线上环境禁止打印console.log

当我们在开发项目时&#xff0c;我们会使用大量的console.log&#xff0c;这样方便我们去调试&#xff0c;但是当正常上线后&#xff0c;在生产环境&#xff0c;我们是不喜欢打印的信息暴露在浏览器控制台的。 这时候我们可以通过一行代码解决&#xff1a; 在main.js文件中添加…

代码随想录算法训练营第二十五天|235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

669. 修剪二叉搜索树 文档讲解&#xff1a;代码随想录 代码链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 这道题目中删除的可能不只是一个节点 常见误区&#xff1a; 遇到一个不在区间范围内的节点&#xff0c;我们不能直接将其删除&#xff0c;因为其左右孩子可…

转转小程序数据处理

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

仿照JDK源码写一个ArrayList实现

仿照JDK编写一个简化的ArrayList实现是一个很好的学习Java集合框架内部工作原理的方式。以下是一个简化版的ArrayList实现,它包含了基本的添加、获取、删除和大小检查功能。 public class MyArrayList<E> {private static final int DEFAULT_CAPACITY = 10;private Obj…

20240511日记

今天工作内容&#xff1a; 1.二期2号机EAP测试 2.二期开门机器暂停&#xff08;停轴&#xff0c;停流水线电机&#xff09;&#xff0c;关闭门后继续功能测试 3.针点位偏移还需要调整&#xff0c;未进行大批量验证是否偏移&#xff08;S3模板点位测试&#xff0c;两台机各焊…

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.…

SolidWorks将装配体中的草图投影到零件中

SolidWorks将装配体中的草图投影到零件中 在SolidWorks中&#xff0c;将装配体中的草图投影到零件中是一种高级技术&#xff0c;特别适用于那些需要基于装配体上下文创建或修改零件的情形。这个过程不仅有助于确保零件间的精确配合&#xff0c;还能显著提高设计效率。下面是一…

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

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