Android通过listview实现输入框自定义提示栏(代替AutoCompleteTextView自动完成文本框)

news2024/10/6 20:32:07

效果图

背景

本人因为一些需求初次接触android,需要实现一个类似android自带的AutoCompleteTextView(自动完成文本框),但和其不同的是通过后端接口直接筛选数据(自己的分词处理规则),然后返回前端直接显示即可。

思路

 这个listview“提示框”在输入框获得焦点的情况下才显示,并且每次输入框内内容变化时,触发网络请求更新“提示框”显示的内容,在用户点击了“提示框”中的item后,将item的内容替换输入框当前内容,并关闭提示框。

实现

第一步、配置布局文件

利用 RelativeLayout布局,让edittext和listview重叠显示,然后利用

android:layout_below="@+id/et_skin"

让listview定位在edittext输入框的底部,并通过

android:visibility="gone"

默认提示框先不显示,然后在父布局中使用

android:focusable="true"
android:focusableInTouchMode="true"

让输入框不会自动触发焦点,最后只需要等到输入框触发焦点时再显示提示框即可(其他输入框依次定位于上一个输入框底部,listview置于最后(最上层))。效果图及代码如下:

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:layout_marginBottom="20dp">

                <EditText
                    android:id="@+id/et_skin"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:inputType="text"
                    android:lines="1"
                    android:background="@drawable/edittext_back"
                    android:padding="7dp"
                    android:textColorHint="@color/notice_item_time"
                    android:hint="皮肤名"/>
                
                <!-- 其他输入框依次定位于上一个输入框底部,listview置于最后(最上层) -->

                <ListView
                    android:id="@+id/lv_order_skin"
                    android:layout_width="match_parent"
                    android:layout_height="190dp"
                    android:visibility="gone"
                    android:background="@drawable/order_input_listview_bg"
                    android:layout_below="@+id/et_skin" />

            </RelativeLayout>

 第二步、绑定布局、适配器-实现功能

这里通过分别监听:输入框焦点获取和失去、输入框内容变化、提示框item点击事件来实现我们的需求,具体代码及备注如下:

    private List<String> auto_list_skin = new ArrayList<>(); // 输入框自动提示内容集合
    private ArrayAdapter<String> adapter_skin; // 适配器
    private EditText et_skin; // 输入框
    private ListView lv_order_skin; // listview提示框

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);

        // 绑定组件
        et_skin = view_default.findViewById(R.id.et_skin);
        lv_order_skin = view_default.findViewById(R.id.lv_order_skin);

        // listview提示框-皮肤名-绑定数据集合
        adapter_skin = new ArrayAdapter<>(OrderActivity.this,android.R.layout.simple_list_item_1, auto_list_skin);
        // 组件绑定适配器
        lv_order_skin.setAdapter(adapter_skin);

        // 监听iten点击事件
        lv_order_skin.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                et_skin.setText(auto_list_skin.get(i)); // 选中item-更新数据到输入框中
                et_skin.setSelection(auto_list_skin.get(i).length()); // 让输入框内的光标定位到最后一位
                lv_order_skin.setVisibility(View.GONE); // 隐藏提示栏
            }
        });

        // 输入框-皮肤-焦点监听事件
        et_skin.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {

                } else {
                    lv_order_skin.setVisibility(View.GONE); // 隐藏提示栏
                }
            }
        });

        // 输入框-皮肤-输入变化事件
        et_skin.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                searchInfo(et_skin.getText().toString(), adapter_skin); // 执行网络请求-更新提示框内容
                lv_order_skin.setVisibility(View.VISIBLE); // 显示提示栏
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

最后在网路请求结果中,通过如下代码更新数据到提示框中,这样完整的功能就实现了!

auto_list_skin.clear(); // 清空数据数组
auto_list_skin.add("新数据item"); // 添加数据到数组中
adapter_skin.notifyDataSetChanged(); // 更新数组到listtview提示框中
                        

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

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

相关文章

【LeetCode刷题笔记(5)】【Python】【盛最多水的容器】【双指针】【中等】

文章目录 盛最多水的容器算法题描述示例示例 1示例 2 提示题意拆解 解决方案&#xff1a;【双指针】运行结果复杂度分析 结束语 盛最多水的容器 盛最多水的容器 算法题描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (…

虚拟展会展览如何搭建,虚拟展会展览有哪些优势

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟展会展览正逐渐成为企业推广和交流的新方式。那么虚拟展会展览应该如何搭建&#xff0c;虚拟展会展览又能带来哪些好处呢&#xff1f; 一.什么是虚拟展会展览 虚拟展会展览是一种通过网络平台进行的展览&#xff0c;与传…

制作RK3568 ubuntu20.04桌面版镜像

平台 主控: RK3568 编译主机: Ubuntu 20.04 AMD64 目标版本: Ubuntu 20.04 概述 RK3568是极具性价比的高能国产“芯“ , 是Rockchip面向与AIOT和工业市场打造的一款高性能、低功耗、功能丰富的国产化应用处理器。采用四核64位Cortex-A55架构&#xff0c;主频高达2.0GHz&#x…

数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)

目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列的概念 队列&#xff08;Queue&#xff0…

如何在使用Docker快速部署StackEdit并实现公网访问本地编辑器远程办公

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

简单好用的图像编辑:Pixelmator Pro直装中文 for Mac

在 Pixelmator Pro 中&#xff0c;您可以找到从亮度、对比度和曝光等基本颜色调整到多通道曲线和基于轮的颜色平衡等高级工具的所有内容。 自动增强照片。 许多最重要的调整可以自动应用&#xff0c;使用经过 2000 万张照片训练的机器学习算法。 完善每一个细节。 神奇地移除…

回收站数据恢复,分享3个可行方法!

“我真的太粗心啦&#xff01;本来想删除一些电脑里不重要的文件&#xff0c;但是不小心把一些很重要的文件一起删除了&#xff0c;这可怎么办呢&#xff1f;我应该通过什么方法找回这些文件呢&#xff1f;” 在使用电脑的过程中&#xff0c;误删文件是很多用户都无法避免的一件…

使用vs code开发microPython,消除库文件报错

使用vs code 写microPython代码的时候&#xff0c;总是遇到库文件报错&#xff0c;也就是类似machine之类的库下面会有波浪线&#xff0c;看起来很是别扭。 前几天在翻看树莓派pico的文档&#xff0c;发现里面提供了很好的方法。 安装vs code环境 $ sudo apt update $ sudo a…

如何在Windows系统上部署VisualSVN并实现远程访问管理界面【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

eclipse安装astview插件

astview插件可以展示java源码经过词法、语法分析后生成的抽象语法树&#xff08;AST&#xff09;&#xff1a; 在eclipse中安装该插件&#xff0c;见官方&#xff1a;org.eclipse.jdt.astview - AST View | The Eclipse Foundation 我的eclipse版本2020-06&#xff0c;开始使用…

触想智能工业一体机在金属3D打印机上的应用

1、行业发展背景 3D打印又称“增材制造”&#xff0c;是一种以数字模型为基础&#xff0c;通过逐层堆叠将打印材料熔结固化为三维实体物件的先进制造技术。 随着航空航天、科研、医疗、汽车等精工领域的颠覆性发展&#xff0c;制造业对于高强度、高精度、轻量型、柔性化金属零件…

联合电子车载充配电单元全球量产

2023年12月&#xff0c;联合电子新一代车载充配电单元批量交付。该产品将应用于全球市场&#xff0c;可覆盖中国、欧洲、北美、日本的交流与直流充电通讯体系。 该车载充配电单元由车载充电机&#xff08;On-board Charger&#xff09;和高压直流转换器&#xff08;HV DCDC Co…

Python数据科学视频讲解:Python数据检索

3.3 Python数据检索 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解3.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应…

Linux服务器性能优化小结

文章目录 生产环境监测常见专业名词扫盲服务器平均负载服务器平均负载的定义如何判断平均负载值以及好坏情况如果依据平均负载来判断服务器当前状况系统平均负载和CPU使用率的区别 CPU上下文切换基本概念3种上下文切换进程上下文切换线程上下文切换中断上下文切换 查看上下文切…

Kafka消息延迟和时序性详解(文末送书)

目录 一、概括1.1 介绍 Kafka 消息延迟和时序性1.1.1 什么是 Kafka 消息延迟&#xff1f;1.1.2 为什么消息延迟很重要&#xff1f;1.1.3 什么是 Kafka 消息时序性&#xff1f;1.1.4 消息延迟和时序性的关系 1.2 延迟的来源1.2.1 Kafka 内部延迟 二、衡量和监控消息延迟2.1 延迟…

内网BUG管理系统本地部署并结合内网穿透实现异地远程访问

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

2023.12.17Linux基础命令

ls -l详细信息 -a所有 springcloud微服务 ctrlalt鼠标左键&#xff0c;从虚拟机中回到本机 执行这两条语句 拿到远程主机的ip地址之后就要试图连接 要实现连接&#xff0c;就要有远程连接的软件 ssh和http一样&#xff0c;也是一种协议 SSH 是 Secure Shell&am…

查看知乎数学公式Tex源码的方法

首先使用F12打开开发者工具&#xff0c;再使用元素选择器选中要查看的公式。 在源码对应位置附近可以看到一个类型为 math/tex 的 script&#xff0c;如果没找到可以展开目录查找。

H264码流打包分析

H264码流打包分析 SODB 数据比特串&#xff0d;&#xff0d;&#xff1e;最原始的编码数据 RBSP 原始字节序列载荷&#xff0d;&#xff0d;&#xff1e;在SODB的后面填加了结尾比特&#xff08;RBSP trailing bits 一个bit“1”&#xff09;若干比特“0”,以便字节对齐。…

电流源输出的是直流电还是交流电(高精度电流源)

电流源是一种能够提供电流输出的电子设备&#xff0c;它可以产生直流电流或交流电流&#xff0c;具体取决于其设计和应用的需要。 首先&#xff0c;我们来讨论电流源输出直流电的情况。直流电是指电流的方向始终保持不变的电流形式。在一些特定的应用中&#xff0c;需要稳定的、…