如何在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
相关产品推荐
相关产品推荐

