Android搜索框SearchView的实现及应用

引言

在许多Android应用程序中,搜索是一个重要且常用的功能。Android提供了SearchView控件来实现搜索功能。SearchView具有自动完成、搜索历史记录和搜索结果过滤等功能,可以提供良好的用户体验。在本文中,我们将介绍如何在Android应用程序中使用SearchView实现搜索功能,以及一些实际应用场景的示例。

1. SearchView的基本使用

首先,我们需要在XML布局文件中添加SearchView控件:

<SearchView
    android:id="@+id/searchView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:queryHint="请输入搜索关键字" />

然后,在Activity中获取SearchView并设置监听器:

SearchView searchView = findViewById(R.id.searchView);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
        // 处理搜索提交事件
        performSearch(query);
        return true;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        // 处理搜索内容变化事件
        filterSearchResult(newText);
        return true;
    }
});

在上述代码中,我们通过findViewById()方法获取SearchView控件的实例,并设置OnQueryTextListener监听器。OnQueryTextListener接口中的onQueryTextSubmit()方法会在用户提交搜索关键字时被调用,我们可以在该方法中处理搜索事件。onQueryTextChange()方法会在搜索关键字变化时被调用,我们可以在该方法中实现搜索结果的实时过滤。

2. 实际应用示例:搜索联系人

假设我们有一个应用程序需要实现搜索联系人的功能。我们可以通过搜索联系人的姓名或电话号码来快速找到相关的联系人。下面是一个简单的示例:

public class ContactActivity extends AppCompatActivity {
    private List<Contact> contactList;  // 联系人列表
    private List<Contact> searchResultList;  // 搜索结果列表
    private RecyclerView recyclerView;  // 显示搜索结果的RecyclerView
    private ContactAdapter contactAdapter;  // RecyclerView的适配器
    private SearchView searchView;  // SearchView控件

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

        // 初始化联系人列表和搜索结果列表
        contactList = initContactList();
        searchResultList = new ArrayList<>();

        // 初始化RecyclerView
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        contactAdapter = new ContactAdapter(contactList);
        recyclerView.setAdapter(contactAdapter);

        // 初始化SearchView
        searchView = findViewById(R.id.searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                // 处理搜索提交事件
                performSearch(query);
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                // 处理搜索内容变化事件
                filterSearchResult(newText);
                return true;
            }
        });
    }

    // 初始化联系人列表
    private List<Contact> initContactList() {
        // TODO: 初始化联系人列表数据
    }

    // 执行搜索
    private void performSearch(String keyword) {
        searchResultList.clear();
        for (Contact contact : contactList) {
            if (contact.getName().contains(keyword) || contact.getPhoneNumber().contains(keyword)) {
                searchResultList.add(contact);
            }
        }
        contactAdapter.setContactList(searchResultList);
    }

    // 过滤搜索结果
    private void filterSearchResult(String keyword) {
        searchResultList.clear();
        for (Contact contact : contactList) {
            if (contact.getName().contains(keyword) || contact.getPhoneNumber().contains(keyword)) {
                searchResultList.add(contact);
            }
        }
        contactAdapter.setContactList(searchResultList);
    }
}

在上述示例中,我们首先通过initContactList()方法初始化联系人列表。然后,我们在performSearch()方法中根据搜索关键字过滤联系人列表,将符合条件的联系人添加到searchResultList中,并更新RecyclerView的显示。filterSearchResult()方法用于实时过滤搜索结果,当搜索关键字发生变化时,我们同样根据新的关键字过滤联系人列表,并更新RecyclerView。

3. 序列图

下面是一个使用SearchView进行联系人搜索的序列图示