java - RecyclerView 的 SearchView 不起作用
问题描述
我想用 RecyclerView 实现一个 SearchView。
我遵循了一些教程和一些 SO 答案,但没有一个对我有帮助。这是我的活动。我有一些项目只能按名称过滤。
<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentStart="true"
android:background="#C4C4C9"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:paddingEnd="16dp">
<SearchView
android:id="@+id/search_bar"
android:layout_width="300dp"
android:layout_height="35dp"
android:background="@drawable/border_radius"
android:drawableLeft="@drawable/ic_search_black_24dp"
android:hint="@string/search"
android:inputType="textCapWords"
android:textColorHint="@color/dark_gray"/>
<Button
android:layout_width="80dp"
android:layout_height="35dp"
android:background="@drawable/border_radius"
android:backgroundTint="#C2C2C7"
android:hint="Cancel"
android:textSize="20sp"
android:fontFamily="@font/roboto_black"
style="?android:attr/borderlessButtonStyle" />
</LinearLayout>
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView = findViewById(R.id.search_bar);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
searchView.setActivated(true);
searchView.setQueryHint("Kerko");
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
query = getClubs.getName().toLowerCase();
clubsAdapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (searchView.getQuery().length() == 0) {
clubsAdapter.getFilter().filter("");
}
return false;
}
});
ClubsAdapter clubsAdapter;
private ClubsData filteredClubs;
public ClubsFilter(ClubsAdapter clubsAdapter, ClubsData filteredClubs) {
this.clubsAdapter = clubsAdapter;
this.filteredClubs = filteredClubs;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if(constraint != null && constraint.length() > 0) {
constraint = constraint.toString().toLowerCase();
ClubsData filteredClubs = new ClubsData();
for(ClubsData clubsData : filteredClubs) {
if(clubsData.getName().toLowerCase().contains(constraint)) {
filteredClubs.getName();
}
}
}
FilterResults results = new FilterResults();
results.values = filteredClubs;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredClubs = (ClubsData) results.values;
clubsAdapter.notifyDataSetChanged();
}
我创建了另一个仅用于过滤项目的适配器,但我遇到了 foreach 循环的另一个问题:
foreach not applicable to type 'al.sqmo.model.ClubsData'
解决方案
请试试这个
Your Adapter
@Override
public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}
私有类 ValueFilter 扩展过滤器 {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
results.values = mainArrayList;
results.count = mainArrayList.size();
}
else {
ArrayList<Model> filteredExpenses = new ArrayList<Model>();
for (Model requestModel : mainArrayList) {
if (requestModel.getName().toLowerCase().contains( constraint.toString().toLowerCase()) || date.toLowerCase().contains(constraint.toString().toLowerCase()) ) {
filteredExpenses.add(requestModel);
}
}
results.values = filteredExpenses;
results.count = filteredExpenses.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mainArrayList = (ArrayList<Model>) results.values;
notifyDataSetChanged();
if(mainArrayList.isEmpty())
{
activity.findViewById(R.id.txt_no_result).setVisibility(View.VISIBLE);
}
}
}
推荐阅读
- typescript - 尝试从选择器选项访问日期数组时为空
- reactjs - 高图。如何从开始 y 轴开始区域样条图?
- r - 根据R中的分层条件添加带有字母的列
- java - 无法定位元素:通过 POM 执行代码时出错,通过单个 main() 程序执行时相同的定位器工作正常
- 3d - 3d 形状填充连接到 P5.js webGL 上的第一个顶点
- angular - 使用 Angular 7 http 拦截器加载微调器在页面重新加载时不起作用
- ag-grid - AG-GRID 值格式化程序不适用于动态生成的货币
- reactjs - 实现 onSnapshot 函数以获取 reactjs 代码中的实时更新
- javascript - 使用 const 关键字 Javascript 声明数组
- python - OSError:SavedModel 文件不存在于:../dnn/mpg_model.h5/{saved_model.pbtxt|saved_model.pb}