You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android Studio中结合Spinner实现带列表项的搜索功能

实现带搜索功能的Spinner

嘿,看来你想给Spinner加上搜索筛选的功能,刚好你已经搭好了字符串数组和基础Spinner控件的底子,我来一步步帮你把功能补全!

第一步:补全布局,添加搜索输入框

首先把你的search.xml补全,加上一个EditText用来输入搜索关键词:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <EditText
        android:id="@+id/searchEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Search website..."
        android:inputType="text"/>

    <Spinner
        android:id="@+id/search1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"/>
</LinearLayout>

第二步:创建支持过滤的自定义Adapter

Spinner本身不带搜索功能,咱们得写个实现Filterable接口的自定义Adapter来处理筛选逻辑,新建一个SearchableSpinnerAdapter类:

import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import java.util.ArrayList;
import java.util.List;

public class SearchableSpinnerAdapter extends ArrayAdapter<String> implements Filterable {
    private List<String> originalWebsiteList;
    private List<String> filteredWebsiteList;
    private ItemFilter itemFilter = new ItemFilter();

    public SearchableSpinnerAdapter(Context context, int resource, List<String> items) {
        super(context, resource, items);
        originalWebsiteList = new ArrayList<>(items);
        filteredWebsiteList = new ArrayList<>(items);
    }

    @Override
    public Filter getFilter() {
        return itemFilter;
    }

    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            String searchKeyword = constraint.toString().toLowerCase();

            // 如果搜索框为空,就显示全部数据
            if (searchKeyword.isEmpty()) {
                filteredWebsiteList = new ArrayList<>(originalWebsiteList);
            } else {
                List<String> tempList = new ArrayList<>();
                // 遍历原始列表,筛选包含关键词的项
                for (String website : originalWebsiteList) {
                    if (website.toLowerCase().contains(searchKeyword)) {
                        tempList.add(website);
                    }
                }
                filteredWebsiteList = tempList;
            }

            results.values = filteredWebsiteList;
            results.count = filteredWebsiteList.size();
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            clear();
            addAll((List<String>) results.values);
            notifyDataSetChanged();
        }
    }
}

第三步:在Activity中绑定组件并实现搜索逻辑

最后在你的Activity里,把字符串数组转成列表,初始化Adapter,再给搜索框加文本监听触发过滤:

import android.os.Bundle;
import android.widget.EditText;
import android.widget.Spinner;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Arrays;
import java.util.List;

public class SearchActivity extends AppCompatActivity {
    private Spinner websiteSpinner;
    private EditText searchEditText;

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

        websiteSpinner = findViewById(R.id.search1);
        searchEditText = findViewById(R.id.searchEditText);

        // 从strings.xml取出网站数组并转为List
        List<String> websiteList = Arrays.asList(getResources().getStringArray(R.array.Websites));

        // 初始化自定义Adapter并设置给Spinner
        SearchableSpinnerAdapter adapter = new SearchableSpinnerAdapter(this,
                android.R.layout.simple_spinner_item, websiteList);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        websiteSpinner.setAdapter(adapter);

        // 给搜索框添加文本变化监听,实时触发过滤
        searchEditText.addTextChangedListener(new android.text.TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s);
            }

            @Override
            public void afterTextChanged(android.text.Editable s) {}
        });
    }
}

小提示

  • 测试的时候输入关键词比如"G",Spinner的下拉列表会自动筛选出Google和Gmail,完全符合你的需求
  • 如果想让筛选更严格(比如只匹配开头),可以把contains改成startsWith

内容的提问来源于stack exchange,提问作者Ravi Shanker Bhargava Cheruvu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:55:46