当前位置: 首页 > news >正文

Android EditText+ListPopupWindow实现可编辑的下拉列表

Android EditText+ListPopupWindow实现可编辑的下拉列表

    • 📖1. 可编辑的下拉列表
      • ✅步骤一:准备视图
      • ✅步骤二:封装显示方法
      • ✅步骤三:获取视图并监听
    • 📖2. 扩展上下箭头
      • ✅步骤一:准备上下箭头icon图标
      • ✅步骤二:drawableRight属性
      • ✅步骤三:监听图标点击

📖1. 可编辑的下拉列表

效果图:

suggestions

✅步骤一:准备视图

EditText视图:

 <EditTextandroid:id="@+id/edit_text"android:layout_width="0dp"android:layout_weight="1"android:layout_height="35dp"android:layout_marginLeft="0dp"android:layout_marginRight="10dp"android:background="@drawable/shape_edit2"android:inputType="text"android:textColor="@color/black"android:hint="输入内容"android:textSize="16sp" />

shape_edit2形状文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><!-- 指定了形状内部的填充颜色 --><solid android:color="#ffffff" /><!-- 指定了形状轮廓的粗细与颜色 --><strokeandroid:width="1dp"android:color="@color/black_gray" /><!-- 指定了形状四个圆角的半径 --><corners android:radius="0dp" /><!-- 指定了形状四个方向的间距 --><paddingandroid:bottom="2dp"android:left="2dp"android:right="2dp"android:top="2dp" />
</shape>

✅步骤二:封装显示方法

    private ListPopupWindow listPopupWindow;//ListPopupWindowprivate ArrayAdapter<String> adapter;//数组适配private List<String> suggestions;//下拉数据列表private static final int MAX_VISIBLE_ITEMS = 5;//最大显示数据行//显示下拉列表方法private void showSuggestions(String query) {if (listPopupWindow == null) {// 初始化 ListPopupWindowlistPopupWindow = new ListPopupWindow(getActivity());// 初始化适配器adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, new ArrayList<>());listPopupWindow.setAdapter(adapter);listPopupWindow.setAnchorView(edit_text);listPopupWindow.setModal(false);// 设置下拉列表项点击事件listPopupWindow.setOnItemClickListener((parent, view, position, id) -> {String selectedItem = adapter.getItem(position);if (selectedItem != null) {// 设置编辑框内容为选中项,并将光标移至文本末尾edit_text.setText(selectedItem);edit_text.setSelection(selectedItem.length());}// 隐藏下拉列表listPopupWindow.dismiss();});}// 过滤并设置下拉列表数据List<String> filteredSuggestions = new ArrayList<>();for (String suggestion : suggestions) {if (suggestion.toLowerCase().contains(query.toLowerCase())) {filteredSuggestions.add(suggestion);}}// 更新适配器数据adapter.clear();adapter.addAll(filteredSuggestions);// 如果过滤后的建议列表不为空,则显示下拉列表if (!filteredSuggestions.isEmpty()) {// 获取每行的高度int itemHeight = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);// 动态计算ListPopupWindow 的高度,最大高度=MAX_VISIBLE_ITEMSint height = Math.min(filteredSuggestions.size(), MAX_VISIBLE_ITEMS) * itemHeight;// 设置 ListPopupWindow 的高度listPopupWindow.setHeight(height);// 显示下拉列表listPopupWindow.show();} else {// 隐藏下拉列表listPopupWindow.dismiss();}}

✅步骤三:获取视图并监听

1.获取输入框

EditText edit_text = findViewById(R.id.edit_text);//输入框

2.生成下拉数据(这里的数据可换成真实的数据库数据),监听文本变化

 		//生成数据suggestions = new ArrayList<>();suggestions.add("item1");suggestions.add("item2");suggestions.add("item3");suggestions.add("item4");//监听文本变化edit_text.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {// No-op}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {showSuggestions(s.toString());//调取显示下拉列表方法}@Overridepublic void afterTextChanged(Editable s) {// No-op}});

至此实现完成。

📖2. 扩展上下箭头

效果图:

12312

✅步骤一:准备上下箭头icon图标

上箭头item_icon_up.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:width="30dp"android:height="30dp"android:drawable="@drawable/icon_up_selected" />
</layer-list>

下箭头item_icon_down.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:width="30dp"android:height="30dp"android:drawable="@drawable/icon_down_selected" />
</layer-list>

里面的图片可直接再阿里巴巴图标库搜索"上拉"、"下拉"即可

地址:https://www.iconfont.cn/

✅步骤二:drawableRight属性

编辑框添加drawableRight属性,EditText可以添加上下左右图片资源,我们添加右边即可。

<EditTextandroid:id="@+id/edit_text"android:layout_width="0dp"android:layout_height="35dp"android:layout_marginLeft="0dp"android:layout_marginRight="10dp"android:layout_weight="1"android:background="@drawable/shape_edit2"android:drawableRight="@drawable/item_icon_up"android:hint="输入停点名/车位号/设备号"android:inputType="text"android:textColor="@color/black"android:textSize="16sp" />

✅步骤三:监听图标点击

       //监听图标点击editText.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {final int DRAWABLE_RIGHT = 2; // 右侧图标的位置// 检查触摸事件是否为抬起事件if (event.getAction() == MotionEvent.ACTION_UP) {// 检查触摸位置是否在右侧图标范围内if (event.getX() >= (editText.getWidth() - editText.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {// 切换图标并处理对应逻辑if (isIconDown) {// 当前图标是 item_icon_down,切换为 item_icon_upeditText.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.item_icon_up), null);// 处理 item_icon_up 的逻辑showSuggestions(editText.getText().toString());if (listPopupWindow != null) listPopupWindow.show();} else {// 当前图标是 item_icon_up,切换为 item_icon_downeditText.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.item_icon_down), null);// 处理 item_icon_down 的逻辑showSuggestions(editText.getText().toString());if (listPopupWindow != null) listPopupWindow.dismiss();}// 切换图标状态isIconDown = !isIconDown;return true;}}return false;}});

setCompoundDrawablesWithIntrinsicBounds方法的参数分别是设置左、上、右、下位置。

setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);

另外定义图标位置的常量如下:

      // 定义图标位置的常量,分别为左、上、右、下final int DRAWABLE_LEFT = 0;final int DRAWABLE_TOP = 1;final int DRAWABLE_RIGHT = 2;final int DRAWABLE_BOTTOM = 3;

相关文章:

Android EditText+ListPopupWindow实现可编辑的下拉列表

Android EditTextListPopupWindow实现可编辑的下拉列表 &#x1f4d6;1. 可编辑的下拉列表✅步骤一&#xff1a;准备视图✅步骤二&#xff1a;封装显示方法✅步骤三&#xff1a;获取视图并监听 &#x1f4d6;2. 扩展上下箭头✅步骤一&#xff1a;准备上下箭头icon图标✅步骤二&…...

dify/api/models/task.py文件中的数据表

源码位置&#xff1a;dify/api/models/task.py CeleryTask 表结构 字段英文名数据类型字段中文名字备注idIntegerID自增主键&#xff0c;任务ID序列task_idString任务ID唯一任务标识statusString状态默认值为 PENDINGresultPickleType结果可为空date_doneDateTime完成日期默认…...

hdu物联网硬件实验3 按键和中断

学院 班级 学号 姓名 日期 成绩 实验题目 按键和中断 实验目的 实现闪灯功能转换 硬件原理 无 关键代码及注释 /* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached…...

pytorch通过 tensorboardX 调用 Tensorboard 进行可视化

示例 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transformsfrom tensorboardX import SummaryWriter# 定义神经网络模型 class SimpleCNN(nn.Module):def __init__(self):…...

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身?

linux查看目录下的文件夹命令&#xff0c;find 查找某个目录&#xff0c;但是不包括这个目录本身&#xff1f; Linux中查看目录下的文件夹的命令是使用ls命令。ls命令用于列出指定目录中的文件和文件夹。通过不同的选项可以实现显示详细信息、按照不同的排序方式以及使用不同的…...

单一设备上的 2 级自动驾驶:深入探究 Openpilot 的奥秘

Level 2 Autonomous Driving on a Single Device: Diving into the Devils of Openpilot 单一设备上的 2 级自动驾驶&#xff1a;深入探究 Openpilot 的奥秘 Abstract Equipped with a wide span of sensors, predominant autonomous driving solutions are becoming more m…...

向github远程仓库中push,要求使用token登录

Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. 如上&#xff0c;当向github远程仓库push时&#xff0c;输入github的用户名和密码出现如上错误&#xff0c;要求使用token登录&#xff0c;此时只需要用户…...

最全windows提权总结(建议收藏)

当以低权用户进去一个陌生的windows机器后&#xff0c;无论是提权还是后续做什么&#xff0c;第一步肯定要尽可能的搜集信息。知己知彼&#xff0c;才百战不殆。 常规信息搜集 systeminfo 查询系统信息hostname 主机名net user 查看用户信息netstat -ano|find "3389&quo…...

Could not find Chrome (ver.xxxxx). This can occur if either\n

文章目录 错误解决方法 错误 Could not find Chrome (ver. 119.0.6045.105). This can occur if either\n 1. you did not perform an installation before running the script (e.g. npx puppeteer browsers install chrome) or\n 2. your cache path is incorrectly configu…...

Conmi的正确答案——ESP32-C3开启安全下载模式

IDF版本&#xff1a;4.4.7 注意事项&#xff1a;一旦烧录“安全下载模式”&#xff0c;模组将无法被读取或清理&#xff0c;只能通过eclipse原项目烧录程序进行重新烧录&#xff0c;无法再烧录其他固件。 20240703110201——追加解法&#xff0c;暂时无法解安全下载模式 &…...

从零开始实现大语言模型(一):概述

1. 前言 大家好&#xff0c;我是何睿智。我现在在做大语言模型相关工作&#xff0c;我用业余时间写一个专栏&#xff0c;给大家讲讲如何从零开始实现大语言模型。 从零开始实现大语言模型是了解其原理及领域大语言模型实现路径的最好方法&#xff0c;没有之一。已有研究证明&…...

科普文本分类背后的数学原理——最新版《数学之美》第14、15章读书笔记

新闻分类&#xff0c;或广义上的文本分类&#xff0c;其核心任务是根据文本内容将相似文本聚合在同一类别中。在新闻领域&#xff0c;这意味着将报道划分为财经、体育、军事等不同主题。人类执行此任务时&#xff0c;通过阅读和理解新闻的主旨来进行归类。然而&#xff0c;作者…...

华为云生态和快速入门

华为云生态 新技术催生新物种&#xff0c;新物种推动新生态 数字技术催生各类运营商去重塑并颠覆各行业的商业模式 从业务层面看&#xff0c;企业始终如一的目标是业务增长和持续盈利&#xff0c;围绕这些目标衍生出提质、增效、降本、安全、创新和合规的业务诉求&#xff0c…...

卷积神经网络——LeNet——FashionMNIST

目录 一、整体结构二、model.py三、model_train.py四、model_test.py GitHub地址 一、整体结构 二、model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet,self).__init__()self.c1 nn.Conv…...

k8s-第十二节-DaemonSet

DaemonSet是什么? DaemonSet 是一个确保全部或者某些节点上必须运行一个 Pod的工作负载资源(守护进程),当有node(节点)加入集群时, 也会为他们新增一个 Pod。 下面是常用的使用案例: 可以用来部署以下进程的pod 集群守护进程,如Kured、node-problem-detector日志收集…...

Mysql-内置函数

一.什么是函数&#xff1f; 函数是指一段可以直接被另外一段程序调用的程序或代码。 mysql内置了很多的函数,我们只需要调用即可。 二.字符串函数 MySQL中内置了很多字符串函数: 三.根据需求完成以下SQL编写 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全…...

新浪API系列:支付API打造无缝支付体验,畅享便利生活(3)

在当今数字化时代&#xff0c;支付功能已经成为各类应用和平台的必备要素之一。作为开发者&#xff0c;要构建出安全、便捷的支付解决方案&#xff0c;新浪支付API是你不可或缺的利器。新浪支付API提供了全面而强大的接口和功能&#xff0c;帮助开发者轻松实现在线支付的集成和…...

终于弄明白了什么是EI!

EI是Engineering Index的缩写&#xff0c;中文意为“工程索引”&#xff0c;是由美国工程信息公司(Engineering Information, Inc.)编辑出版的著名检索工具。它始创于1884年&#xff0c;拥有超过一个世纪的历史&#xff0c;是全球工程界最权威的文献检索系统之一。EI虽然名为“…...

微信小程序常见页面跳转方式

1. wx.navigateTo() 保留当前页&#xff0c;跳转到不是 tabbar 的页面&#xff0c;会新增页面到页面栈。通过返回按钮或 wx.navigateBack()返回上一个页面。 2. wx.redirectTo() 跳转到不是 tabbar 的页面&#xff0c;替换当前页面。不能返回。 3. wx.switchTab() 跳转到 …...

Vim常用整理快捷键

一、光标跳转 参数释义w下一行首字符e下一行尾字符0跳至行首$跳至行尾gg跳至文首5gg跳至第五行gd标记跳转到当前光标所在的变量的定义位置fn找当前行后的n字符&#xff0c;跳转到n字符位置 二、修改类操作 参数释义D删除光标之后的字符dd删除整行x删除当前字符yy复制一行p向…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...