輸入框輸入字符時,彈出下拉列表顯示:精確匹配、歷史記錄、模糊分類匹配。類似淘寶搜索框(簡化版)。
Android 內建支援下拉提示的輸入框,配合 Adapter 即可實現基本功能。
<AutoCompleteTextView
android:id="@+id/actv_search"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="1" /> <!-- 輸入1字符即提示 -->
// 靜態示例,實際可從數據庫/網絡/SharedPreferences 讀取歷史
List allData = Arrays.asList("蘋果", "蘋果手機", "小米", "小米手機", "華為", "華為手機");
List history = getSearchHistory(); // 從 SP 讀取
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);
actv.setOnItemClickListener((parent, view, position, id) -> {
String selected = (String) parent.getItemAtPosition(position);
saveToHistory(selected); // 寫入 SharedPreferences
doSearch(selected);
});
RecyclerView + PopupWindow 完全自定義下拉樣式(分組標題、圖標、高亮關鍵字)。CursorAdapter 直接查詢 SQLite,避免全量加載內存。詳細代碼:Android AutoCompleteTextView 實現搜索歷史提示
AutoCompleteTextView + 自定義 Filter 可快速實現下拉模糊查詢。核心在 performFiltering 中融合「歷史優先、模糊匹配、去重」邏輯。複雜 UI 需求可升級為 RecyclerView 方案。