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

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

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

📖1. 可编辑的下拉列表

效果图:

suggestions

✅步骤一:准备视图

EditText视图:

 <EditText
                android: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" />
    <!-- 指定了形状轮廓的粗细与颜色 -->
    <stroke
        android:width="1dp"
        android:color="@color/black_gray" />
    <!-- 指定了形状四个圆角的半径 -->
    <corners android:radius="0dp" />
    <!-- 指定了形状四个方向的间距 -->
    <padding
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp" />
</shape>

✅步骤二:封装显示方法

    private ListPopupWindow listPopupWindow;//ListPopupWindow
    private ArrayAdapter<String> adapter;//数组适配
    private List<String> suggestions;//下拉数据列表
    private static final int MAX_VISIBLE_ITEMS = 5;//最大显示数据行

	//显示下拉列表方法
    private void showSuggestions(String query) {
        if (listPopupWindow == null) {
            // 初始化 ListPopupWindow
            listPopupWindow = 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_ITEMS
            int 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() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // No-op
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                showSuggestions(s.toString());//调取显示下拉列表方法
            }

            @Override
            public 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">
    <item
        android: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">
    <item
        android:width="30dp"
        android:height="30dp"
        android:drawable="@drawable/icon_down_selected" />
</layer-list>

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

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

✅步骤二:drawableRight属性

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

<EditText
                android: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() {
            @Override
            public 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_up
                            editText.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_down
                            editText.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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十三章 Linux连接档

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

js碰撞检测

碰撞检测 碰撞检测&#xff08;边界检测&#xff09;在前端游戏&#xff0c;以及涉及拖拽交互的场景应用十分广泛。 碰撞&#xff0c;顾名思义&#xff0c;就是两个物体碰撞在了一起&#xff0c;眼睛是可以直观的观察到碰撞的发生。但对于前端实现&#xff0c;如何让 JavaScrip…

使用Simulink基于模型设计(二):系统定义和布局

Simulink模型的顶层系统布局是许多工程团队可以使用的公共环境&#xff0c;是基于模型的设计范式&#xff1a;分析、设计、检验和实现。您可以通过确定模型的结构和各个组件来定义顶层系统。然后&#xff0c;您可以将模型按照层次结构进行组织&#xff0c;分别与系统的各个组件…

群晖NAS配置WebDav服务结合内网穿透实现跨平台云同步思源笔记

文章目录 前言1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 前言 本教程主要分享如何将思源笔记、cpolar内网穿透和群晖WebDav三者相结合&#xff0c;实现思源笔记的云同步…

华为手机照片视频恢复,2种有效方法,让你的回忆重现

“曾经沧海难为水&#xff0c;除却巫山不是云。”这话放在我们手机里的照片视频上也是相当贴切。那些一不小心删除或丢失的珍贵回忆&#xff0c;就像巫山云雨般飘渺难寻&#xff0c;让人心痛不已。照片视频恢复究竟该如何解决呢&#xff1f;今天我就为你带来2种手机照片视频恢复…

C++--继承(下)

目录 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承与菱形虚拟继承 8.继承与组合 5.继承与友元 简单来说就是父类的友元函数子类继承不了&#xff0c;所以父类的友元函数不能访问子类的私有和保护成员 class Person { public:friend void Display(const Person&…

DeepMind的JEST技术:AI训练速度提升13倍,能效增强10倍,引领绿色AI革命

谷歌旗下的人工智能研究实验室DeepMind发布了一项关于人工智能模型训练的新研究成果&#xff0c;声称其新提出的“联合示例选择”&#xff08;Joint Example Selection&#xff0c;简称JEST&#xff09;技术能够极大地提高训练速度和能源效率&#xff0c;相比其他方法&#xff…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十一章 Linux 帮助手册

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

机器学习笔记:初始化0的问题

1 前言 假设我们有这样的两个模型&#xff1a; 第一个是逻辑回归 第二个是神经网络 他们的损失函数都是交叉熵 sigmoid函数的导数&#xff1a; 他们能不能用0初始化呢&#xff1f; 2 逻辑回归 2.1 求偏导 2.1.1 结论 2.1.2 L对a的偏导 2.1.3 对w1&#xff0c;w2求偏导 w2同…

Springboot整合Jsch-Sftp

背景 开发一个基于jsch的sftp工具类&#xff0c;方便在以后的项目中使用。写代码的过程记录下来&#xff0c;作为备忘录。。。 Maven依赖 springboot依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par…

《Windows API每日一练》8.5 listbox控件

列表框是将一批文本字符串显示在一个具有滚动功能的方框中的控件。通过发送消息到列表框的窗口过程&#xff0c;程序可以添加或删除列表中的字符串。当列表框中的一个项目被选中时&#xff0c;列表框控件便发送 WM_COMMAND消息到其父窗口。然后父窗口确定哪个项目被选中。 本节…

镭速助力全球高速传输,实现点对点高效传输打破时差壁垒!

在当今全球化的背景下&#xff0c;跨国界的文件协作已成为许多跨国企业日常工作的一部分。但是&#xff0c;时差和网络不稳定等因素常常影响团队间的有效交流与合作。特别是在大文件传输环节&#xff0c;传统的在线传输方法在接收方离线或网络条件不佳时显得力不从心&#xff0…

关于原型和原型链的学习和实践

在前端面试中&#xff0c;原型和原型链始终是一个避不开的问题&#xff0c;今天就弄明白! 原型和原型链 对象的创建方式工厂模式构造函数模式原型模式 原型和原型链实践 对象的创建方式 原型和原型链都是关于对象的内容&#xff0c;先来看一下JavaScript中对象的构建方式。 工…

什么是C#

C#是一种面向对象的语言与c语言不同 C语言是面向过程的编程 C#运行于.NETFramework和.NETCore之上的高级语言 C#是由C和C衍生而来的一种语言 在C#中不建议使用指针 什么叫面向对象 是一种编程范式&#xff0c;它将现实世界中的事物抽象为对象&#xff0c;并通过对象之间的…

深度学习的数学PDF

链接: https://pan.baidu.com/s/1_jScZ7dcyAWGqbrad6bbCQ?pwd9gj9 提取码: 9gj9 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验17 开放最短路径优先OSPF

一、实验目的 1.验证OSPF协议的作用&#xff1b; 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; 2.验证OSPF协议的作用。 四、实验步骤 1.构建网…

SpringCloud跨微服务的远程调用,如何发起网络请求,RestTemplate

在我们的业务流程之中不一定都会是自己模块查询自己模块的信息&#xff0c;有些时候就需要去结合其他模块的信息来进行一些查询完成相应的业务流程&#xff0c;但是在SpringCloud每个模块都相对独立&#xff0c;数据库也有数据隔离。所以当我们需要其他微服务模块的信息的时候&…

NuGet 中国国内镜像

有时候网络不好&#xff0c;需要使用国内的一些镜像源。 华为资源&#xff1a; https://repo.huaweicloud.com/repository/nuget/v3/index.json 腾讯资源&#xff1a; https://mirrors.cloud.tencent.com/nuget/ 微软中国镜像源&#xff1a;https://nuget.cdn.azure.cn/v3…

BIOTIN-Gly-Asp-Gly-Asp-Glu-Val-Asp-Gly-Cys 生物素标记多肽

BIOTIN-Gly-Asp-Gly-Asp-Glu-Val-Asp-Gly-Cys 生物素标记多肽 生物素标记多肽的特点 高亲和力结合&#xff1a;生物素与链霉亲和素&#xff08;streptavidin&#xff09;或抗生物素蛋白&#xff08;avidin&#xff09;之间的结合是生物学上已知的最强的非共价相互作用之一。这种…

大模型知识大全2-资源【大模型】

文章目录 可用的模型部分模型的训练规模和数据常用数据集外文中文书籍和论文百科数据代码混合数据集微调数据集对齐数据集 可用的模型 仅记录中文可用的表现较优的模型LLaMA、LLaMA2、LLaMA3&#xff08;规模在7,13,30,65左右&#xff0c;需要搭配ChineseLLaMA的LoRA权重使用&…