一、简介
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); } } }