
在android应用中,searchview是实现搜索功能的常用ui组件。当用户在searchview中输入文本时,我们通常需要根据输入内容实时过滤显示的数据。这个过程主要涉及两个核心组件:
用户在SearchView中输入空格后出现空白结果,通常是因为Filter的实现没有正确处理查询字符串中的空格或空字符串。当用户输入一个或多个空格时,performFiltering方法接收到的constraint可能是一个非空但只包含空格的字符串。如果过滤逻辑没有对其进行trim()处理或特殊判断,就可能导致没有任何匹配结果。
以下是如何构建一个健壮的自定义Filter来解决这个问题,并将其集成到一个RecyclerView.Adapter中:
首先,我们定义一个简单的数据模型,例如一个包含名称的列表项。
public class MyItem {
private String name;
public MyItem(String name) {
this.name = name;
}
public String getName() {
return name;
}
}接下来,我们创建一个RecyclerView.Adapter,并让它实现Filterable接口。
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements Filterable {
private List<MyItem> originalList; // 原始完整数据列表
private List<MyItem> filteredList; // 过滤后的数据列表
public MyAdapter(List<MyItem> itemList) {
this.originalList = new ArrayList<>(itemList); // 复制一份原始数据
this.filteredList = new ArrayList<>(itemList);
}
@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.textView.setText(filteredList.get(position).getName());
}
@Override
public int getItemCount() {
return filteredList.size();
}
@Override
public Filter getFilter() {
return new ItemFilter();
}
public static class MyViewHolder extends RecyclerView.ViewHolder {
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(android.R.id.text1);
}
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<MyItem> suggestions = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
// 如果查询为空或长度为0,显示所有原始数据
suggestions.addAll(originalList);
} else {
// 关键步骤:对查询字符串进行trim()处理,并转换为小写进行不敏感匹配
String filterPattern = constraint.toString().toLowerCase(Locale.getDefault()).trim();
// 如果trim()后字符串为空,也显示所有原始数据
if (filterPattern.isEmpty()) {
suggestions.addAll(originalList);
} else {
// 遍历原始数据进行过滤
for (MyItem item : originalList) {
if (item.getName().toLowerCase(Locale.getDefault()).contains(filterPattern)) {
suggestions.add(item);
}
}
}
}
results.values = suggestions;
results.count = suggestions.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// 发布过滤结果到UI
filteredList.clear();
filteredList.addAll((List<MyItem>) results.values);
notifyDataSetChanged(); // 通知Adapter数据已更改,刷新UI
}
}
}在上述ItemFilter的performFiltering方法中,我们采取了以下关键措施来解决“输入空格后空白”的问题:
最后,在你的Activity或Fragment中设置SearchView并绑定Adapter。
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter adapter;
private List<MyItem> dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 假设你有一个activity_main.xml布局
// 示例数据
dataList = new ArrayList<>();
dataList.add(new MyItem("Apple"));
dataList.add(new MyItem("Banana"));
dataList.add(new MyItem("Cherry"));
dataList.add(new MyItem("Date"));
dataList.add(new MyItem("Elderberry"));
dataList.add(new MyItem("Fig"));
dataList.add(new MyItem("Grape"));
recyclerView = findViewById(R.id.recyclerView); // 假设布局中有一个ID为recyclerView的RecyclerView
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyAdapter(dataList);
recyclerView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.search_menu, menu); // 假设你有一个search_menu.xml菜单文件
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchItem.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
// 当用户提交搜索时触发,通常我们在这里执行一次最终过滤
adapter.getFilter().filter(query);
searchView.clearFocus(); // 提交后清除焦点
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// 当搜索文本改变时实时触发过滤
adapter.getFilter().filter(newText);
return true;
}
});
return true;
}
}search_menu.xml示例:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="Search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>activity_main.xml示例:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>// ... 在 performFiltering 方法中
if (filterPattern.isEmpty()) {
suggestions.addAll(originalList);
} else {
suggestions = originalList.stream()
.filter(item -> item.getName().toLowerCase(Locale.getDefault()).contains(filterPattern))
.collect(Collectors.toList());
}
// ...这能使代码更简洁,但核心的trim()和空字符串判断逻辑依然重要。
通过遵循上述指南和示例代码,你可以构建一个强大且用户友好的SearchView过滤功能,有效避免输入空格后出现空白结果的问题。
以上就是Android SearchView 高效过滤:解决输入空格后结果空白问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号