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;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42202.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redisson分布式鎖、可重入鎖

介紹Redisson 什么是 Redisson&#xff1f;來自于官網上的描述內容如下&#xff01; Redisson 是一個在 Redis 的基礎上實現的 Java 駐內存數據網格客戶端&#xff08;In-Memory Data Grid&#xff09;。它不僅提供了一系列的 redis 常用數據結構命令服務&#xff0c;還提供了…

力扣56.合并區間

力扣56.合并區間 按左端點排序 判斷左端點是否小于等于當前右端點**&#xff08;可以合并&#xff09;** class Solution {public:vector<vector<int>> merge(vector<vector<int>>& intervals) {ranges::sort(intervals);vector<vector<i…

北森銳途人才競聘盤點管理測評:高管領導力六大評判標準深度解析萬達商管中國綠發等

北森銳途人才管理測評&#xff1a;高管領導力評判標準深度解析 在企業高管的盤點與競聘測評領域&#xff0c;眾多管理人才面臨評估自身領導力的挑戰。面對能力卓越、職級顯赫的同僚&#xff0c;許多管理者感到缺乏一套權威且專業的評價體系。然而&#xff0c;無論是天賦異稟的領…

vue+cesium之加載天地圖影像底圖與注記

目錄 1.創建地圖容器2.疊加天地圖影像底圖與矢量注記 關鍵代碼3.示例效果圖 Cesium是默認加載了微軟公司的Bing地圖&#xff0c;并提供了BingMapslmageryProvider類來加載Bing地圖。也就是說&#xff0c;在創建Viewer時&#xff0c;如果不指定lmageryProvider類就默認加載Bing地…

一體化預制泵站如何選擇廠家及設備選型

諸城市鑫淼環保小編帶大家了解一下一體化預制泵站如何選擇廠家及設備選型 一體化預制泵站是由玻璃鋼筒體、格柵系統、水泵、內部管道、閥門、液位控制儀、進出水管道、檢修平臺、照明系統、不銹鋼爬梯等組成。該設備的型號是多種多樣的&#xff0c;設備的型號不同&#xff0c;其…

2024年7月2日~2024年7月8日周報

目錄 一、前言 二、完成情況 2.1 吳恩達機器學習系列課程 2.1.1 分類問題 2.1.2 假說表示 2.1.3 判定邊界 2.2 學習數學表達式 2.3 論文寫作情況 2.3.1 題目選取 2.3.2 摘要 2.3.3 關鍵詞 2.3.4 引言部分 2.3.4 文獻綜述部分 三、下周計劃 3.1 存在的問題 3.2 …

C語言之數據在內存中的存儲(1),整形與大小端字節序

目錄 前言 一、整形數據在內存中的存儲 二、大小端字節序 三、大小端字節序的判斷 四、字符型數據在內存中的存儲 總結 前言 本文主要講述整型包括字符型是如何在內存中存儲的&#xff0c;涉及到大小端字節序這一概念&#xff0c;還有如何判斷大小端&#xff0c;希望對大…

2、需求工具 - 編程實戰工具系列文章

需求分析工具 筆者對于需求分析工具的應用&#xff0c;主要是思維導圖軟件和Word。思維導圖用來理清需要的需求功能&#xff0c;而Word用來記錄每個需求功能的實際內容。 對于思維導圖軟件&#xff0c;筆者用過幾個&#xff0c;但是有些需要注冊碼&#xff0c;有些需要費用&…

谷粒商城學習-09-配置Docker阿里云鏡像加速及各種docker問題記錄

文章目錄 一&#xff0c;配置Docker阿里云鏡像加速二&#xff0c;Docker安裝過程中的幾個問題1&#xff0c;安裝報錯&#xff1a;Could not resolve host: mirrorlist.centos.org; Unknown error1.1 檢測虛擬機網絡1.2 重設yum源 2&#xff0c;報錯&#xff1a;Could not fetch…

Redis基礎教程(十五):Redis GEO地理信息查詢與管理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;歡迎各位來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里不僅可以有所收獲&#xff0c;同時也能感受到一份輕松歡樂的氛圍&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

絕區伍--2024年AI發展路線圖

2024 年將是人工智能具有里程碑意義的一年。隨著新模式、融資輪次和進步以驚人的速度出現&#xff0c;很難跟上人工智能世界發生的一切。讓我們深入了解 2024 年可能定義人工智能的關鍵事件、產品發布、研究突破和趨勢。 2024 年第一季度 2024 年第一季度將推出一些主要車型并…

【React Hooks原理 - useEffect、useLayoutEffect】

介紹 在實際React Hooks項目中&#xff0c;我們需要在項目的不同階段進行一些處理&#xff0c;比如在頁面渲染之前進行dom操作、數據獲取、第三方加載等。在Class Component中存在很多生命周期能讓我們完成這個操作&#xff0c;但是在React Hooks沒有所謂的生命周期&#xff0…

python - 類和對象

一.類 類名用大寫字母開頭 屬性是類中的變量&#xff0c;方法是類中的函數 類、class關鍵字&#xff1a; >>> class Turtle: ... color green ... weight 10 ... legs 4 ... shell True ... mount 大嘴 ... def climb(self): ... …

從零開始讀RocketMq源碼(二)Message的發送詳解

目錄 前言 準備 消息發送方式 深入源碼 消息發送模式 選擇發送方式 同步發送消息 校驗消息體 獲取Topic訂閱信息 高級特性-消息重投 選擇消息隊列-負載均衡 裝載消息體發送消息 壓縮消息內容 構造發送message的請求的Header 更新broker故障信息 異步發送消息 …

Open3D KDtree的建立與使用

目錄 一、概述 1.1kd樹原理 1.2kd樹搜索原理 1.3kd樹構建示例 二、常見的領域搜索方式 2.1K近鄰搜索&#xff08;K-Nearest Neighbors, KNN Search&#xff09; 2.2半徑搜索&#xff08;Radius Search&#xff09; 2.3混合搜索&#xff08;Hybrid Search&#xff09; …

ai native 模型微調

AI native 模型微調&#xff08;fine-tuning&#xff09;是指在預訓練模型的基礎上&#xff0c;通過對其參數進行進一步訓練&#xff0c;使其在特定任務上表現更佳。以下是關于模型微調的一些基本步驟和概念&#xff1a; ### 1. 準備數據集 - **數據收集**&#xff1a;收集適用…

后端之路——登錄校驗前言(Cookie\ Session\ JWT令牌)

前言&#xff1a;Servlet 【登錄校驗】這個功能技術的基礎是【會話技術】&#xff0c;那么在講【會話技術】的時候必然要談到【Cookie】和【Session】這兩個東西&#xff0c;那么在這之前必須要先講一下一個很重要但是很多人都會忽略的一個知識點&#xff1a;【Servlet】 什么是…

Oracle PL/SQL 循環批量執行存儲過程

1. 查詢存儲過程 根據數據字典USER_OBJECTS查詢出所有存儲過程。 2. 動態拼接字符串&#xff08;參數等&#xff09; 根據數據字典USER_ARGUMENTS動態拼接參數。 3. 動態執行 利用EXECUTE IMMEDIATE動態執行無名塊。 4. 輸出執行信息 利用DBMS_OUTPUT.PUT_LINE輸出執行成功與…

Android Gradle 開發與應用 (十): Gradle 腳本最佳實踐

目錄 1. 使用Gradle Kotlin DSL 1.1 什么是Gradle Kotlin DSL 1.2 遷移到Kotlin DSL 1.3 優勢分析 2. 優化依賴管理 2.1 使用依賴版本管理文件 2.2 使用依賴分組 3. 合理使用Gradle插件 3.1 官方插件和自定義插件 3.2 插件管理的最佳實踐 4. 任務配置優化 4.1 使用…

Oracle 19c 統一審計表清理

zabbix 收到SYSAUX表空間告警超過90%告警&#xff0c;最后面給出的清理方法只適合ORACLE 統一審計表的清理&#xff0c;傳統審計表的清理SYS.AUD$不適合&#xff0c;請注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…