您的位置:

SearchView:详解Android搜索框

一、简介

SearchView是Android系统中常用的搜索框控件,其功能强大,能够方便地实现搜索功能。使用SearchView,我们可以让用户快速、方便地查找需要的数据,提高用户体验。

二、常用属性

1. android:iconifiedByDefault

设置SearchView是否处于图标化状态。当值为true时,SearchView处于图标化状态,只显示搜索图标;当值为false时,SearchView不处于图标化状态,显示放大镜图标和搜索框。


<SearchView
    android:id="@+id/searchview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:iconifiedByDefault="false"
/>

2. android:queryHint

设置搜索框中的提示文字。当SearchView中没有内容时,显示提示文字帮助用户输入内容。


<SearchView
    android:id="@+id/searchview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:iconifiedByDefault="false"
    android:queryHint="搜索"
/>

3. app:searchIcon

设置搜索图标。可以使用@drawable或@Mipmap引用一张图片作为搜索图标。也可以使用系统自带搜索图标。


<SearchView
    android:id="@+id/searchview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:iconifiedByDefault="false"
    android:queryHint="搜索"
    app:searchIcon="@mipmap/search"
/>

4. app:closeIcon

设置关闭图标。当SearchView中有内容时,显示关闭图标帮助用户清空输入内容。


<SearchView
    android:id="@+id/searchview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:iconifiedByDefault="false"
    android:queryHint="搜索"
    app:searchIcon="@mipmap/search"
    app:closeIcon="@mipmap/close"
/>

5. app:voiceIcon

设置语音图标。当用户点击语音图标时,可以使用语音输入进行搜索。


<SearchView
    android:id="@+id/searchview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:iconifiedByDefault="false"
    android:queryHint="搜索"
    app:searchIcon="@mipmap/search"
    app:closeIcon="@mipmap/close"
    app:voiceIcon="@mipmap/voice"
/>

三、监听事件

1. OnQueryTextListener

当用户输入搜索内容并按下搜索键时触发该事件。


searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    // 当用户按下搜索键时触发该事件
    @Override
    public boolean onQueryTextSubmit(String query) {
        // 搜索
        return false;
    }

    // 当用户输入搜索内容时触发该事件
    @Override
    public boolean onQueryTextChange(String newText) {
        // 处理输入内容
        return false;
    }
});

2. OnCloseListener

当用户点击关闭图标时触发该事件。


searchView.setOnCloseListener(new SearchView.OnCloseListener() {
    @Override
    public boolean onClose() {
        // 处理关闭事件
        return false;
    }
});

四、使用示例

在下面的示例中,我们使用SearchView实现一个简单的搜索功能,当用户输入搜索关键字并按下搜索键时,将搜索结果显示在RecyclerView中。


public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private SearchView searchView;
    private List
    dataList = new ArrayList<>();
    private List
     searchList = new ArrayList<>();
    private MyAdapter adapter;

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

        recyclerView = findViewById(R.id.recyclerview);
        searchView = findViewById(R.id.searchview);

        initData();

        adapter = new MyAdapter(dataList);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);

        // 监听搜索框
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                // 处理搜索结果
                searchList.clear();
                for (String data : dataList) {
                    if (data.contains(query)) {
                        searchList.add(data);
                    }
                }
                // 更新RecyclerView
                adapter.setData(searchList);
                adapter.notifyDataSetChanged();
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }

    private void initData() {
        dataList.add("苹果");
        dataList.add("香蕉");
        dataList.add("橘子");
        dataList.add("柚子");
        dataList.add("葡萄");
        dataList.add("西瓜");
        dataList.add("菠萝");
        dataList.add("草莓");
        dataList.add("樱桃");
        dataList.add("李子");
        dataList.add("柿子");
        dataList.add("哈密瓜");
        dataList.add("橙子");
        dataList.add("芒果");
        dataList.add("猕猴桃");
    }

    class MyAdapter extends RecyclerView.Adapter
      {

        private List
       data;

        MyAdapter(List
       
        data) { this.data = data; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.tv.setText(data.get(position)); } @Override public int getItemCount() { return data.size(); } void setData(List
        
         data) { this.data = data; } } class MyViewHolder extends RecyclerView.ViewHolder { TextView tv; MyViewHolder(View itemView) { super(itemView); tv = itemView.findViewById(android.R.id.text1); } } }