首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 下拉模糊查詢:AutoCompleteTextView 實現搜索歷史與聯想

     編輯:程式設計疑難解答

需求

輸入框輸入字符時,彈出下拉列表顯示:精確匹配、歷史記錄、模糊分類匹配。類似淘寶搜索框(簡化版)。

核心組件:AutoCompleteTextView

Android 內建支援下拉提示的輸入框,配合 Adapter 即可實現基本功能。

實現步驟

1. 佈局 XML

<AutoCompleteTextView
    android:id="@+id/actv_search"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:completionThreshold="1" />  <!-- 輸入1字符即提示 -->

2. 數據源準備

// 靜態示例,實際可從數據庫/網絡/SharedPreferences 讀取歷史
List allData = Arrays.asList("蘋果", "蘋果手機", "小米", "小米手機", "華為", "華為手機");
List history = getSearchHistory(); // 從 SP 讀取

3. 自定義過濾邏輯(關鍵)

ArrayAdapter adapter = new ArrayAdapter(this, 
    android.R.layout.simple_dropdown_item_1line, allData) {
    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                if (constraint == null || constraint.length() == 0) {
                    results.values = Collections.emptyList();
                    results.count = 0;
                } else {
                    List suggestions = new ArrayList<>();
                    String input = constraint.toString().toLowerCase();
                    // 1. 歷史記錄優先
                    for (String h : history) 
                        if (h.toLowerCase().contains(input)) suggestions.add(h);
                    // 2. 精確/模糊匹配數據源
                    for (String s : allData) 
                        if (s.toLowerCase().contains(input) && !suggestions.contains(s)) 
                            suggestions.add(s);
                    results.values = suggestions;
                    results.count = suggestions.size();
                }
                return results;
            }
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                clear();
                if (results.values != null) {
                    for (String s : (List) results.values) add(s);
                }
                notifyDataSetChanged();
            }
        };
    }
};

actv.setAdapter(adapter);

4. 保存搜索歷史

actv.setOnItemClickListener((parent, view, position, id) -> {
    String selected = (String) parent.getItemAtPosition(position);
    saveToHistory(selected); // 寫入 SharedPreferences
    doSearch(selected);
});

進階優化建議

  • 使用 RecyclerView + PopupWindow 完全自定義下拉樣式(分組標題、圖標、高亮關鍵字)。
  • 引入 MaterialAutoCompleteTextView 獲得 Material Design 風格。
  • 大數據量時,採用 CursorAdapter 直接查詢 SQLite,避免全量加載內存。

參考資源

詳細代碼:Android AutoCompleteTextView 實現搜索歷史提示

總結

AutoCompleteTextView + 自定義 Filter 可快速實現下拉模糊查詢。核心在 performFiltering 中融合「歷史優先、模糊匹配、去重」邏輯。複雜 UI 需求可升級為 RecyclerView 方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved