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.hqwc.cn/news/690423.html

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

相关文章

AIGC|将GPTBots与10000+主流软件连接,实现应用场景全覆盖

一、自动化工作流的无限可能&#xff0c;由AI带来 当前市场上存在许多自动化工作流工具&#xff0c;这些工具在很大程度上提升了人们的工作效率&#xff0c;为企业节省了大量时间和人力成本。然而&#xff0c;这些工具并非万能&#xff0c;它们在实际应用中仍存在一定的局限性…

1056: 邻接表到邻接矩阵

解法&#xff1a; #include<iostream> #include<vector> #include<string> using namespace std; int arr[100][100]; int main() {int n;cin >> n;getchar();vector<string> s(n);for (int i 0; i < n; i) {getline(cin, s[i]);}for (int …

波动性悖论:为何低风险股票长期跑赢高风险对手?

从去年开始&#xff0c;“红利低波”类的产品净值稳步向上&#xff0c;不断新高&#xff0c;让很多人关注到了A股“分红高”、“波动率低”这两类股票。分红高的公司更受投资者青睐&#xff0c;这从基本面的角度很容易理解&#xff0c;那么波动率低的股票明明波动更小&#xff…

[数据集][目标检测]交通灯检测数据集VOC+YOLO格式2600张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2600 标注数量(xml文件个数)&#xff1a;2600 标注数量(txt文件个数)&#xff1a;2600 标注…

用户登录后端:验签

前端请求拦截器 工具类 cryptomd5Util.js const crypto require(crypto) const publicKey xxxx export function encryptedHmacMd5Data(appid, data, timestamp) {const hmac crypto.createHmac(md5, publicKey)let params dataif (typeof data object) {for (const i in…

Axure RP移动端交互元件库/交互原型模板

作品类型&#xff1a;元件库/原型模板 更新日期&#xff1a;2023-12-04 当前版本&#xff1a;V1.3 适用范围&#xff1a;App应用/小程序 Axure版本&#xff1a;Axure 9.0均可打开 文件大小&#xff1a;36.7M 历时两个月制作并整理了手机移动端常用的75种组件、90个常用界面模板…

电影网站|基于SSM+vue的电影网站系统(源码+数据库+文档)

电影网站 目录 基于SSMvue的电影网站系统 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道…

Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装&#xff1a; cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、启动Kafaka 1.首先需要启动K…

CentOS 磁盘扩容与创建分区

文章目录 未分配空间创建新分区重启服务器添加物理卷扩展逻辑卷 操作前确认已给服务器增加硬盘或虚拟机已修改硬盘大小&#xff08;必须重启服务才会生效&#xff09;。 未分配空间 示例说明&#xff1a;原服务器只有40G&#xff0c;修改虚拟机硬盘大小再增加20G后硬盘变为60G。…

macOS上将ffmpeg.c编译成Framework

1 前言 本文介绍下在macOS上将ffmpeg的fftools目录下的ffmpeg.c程序&#xff0c;也就是ffmpeg的命令行程序&#xff0c;编译成framework的方法。编译成.a或.dylib的方法类似。 编译环境如下&#xff1a; xcode15.3&#xff1b;ffmpeg release/6.1; 2 编译ffmpeg 首先clone我们…

stl学习以及abc比赛例题

1.引例 一提到查找&#xff0c;我们一上来想的肯定是find()函数或者search()函数&#xff0c;但是这种查找的底层逻辑终究是用顺序查找的方式&#xff0c;运行的时间成本非常高昂&#xff0c;所以平时能不用就不用&#xff0c;比赛的时候用这种查找和自己while遍历&#xff0c…

Maven 的仓库、周期和插件

优质博文&#xff1a;IT-BLOG-CN 一、Maven 仓库 在Maven的世界中&#xff0c;任何一个依赖、插件或者项目构建的输出&#xff0c;都可以称为构建。Maven在某个统一的位置存储所有项目的共享的构建&#xff0c;这个统一的位置&#xff0c;我们就称之为仓库。任何的构建都有唯一…