我的可过滤适配器正在查找结果但未显示
Posted
技术标签:
【中文标题】我的可过滤适配器正在查找结果但未显示【英文标题】:My Filterable Adapter is finding results but not displaying 【发布时间】:2018-09-10 13:28:01 【问题描述】:我在RecyclerView.Adapter<>
中实现了Filterable
,以按名称或地区搜索特定位置。我在Filter
中的performFiltering()
方法中记录每次迭代的结果,就像filteredLocationList
是一个类变量:
private class LocationsAdapter extends RecyclerView.Adapter<LocationsAdapter.MyViewHolder> implements Filterable
private List<Location> locationList;
private List<Location> filteredLocationList;
LocationsAdapter(List<Location> locationList)
this.locationList = locationList;
this.filteredLocationList = locationList;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.view_location_row, parent, false);
return new MyViewHolder(itemView);
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
Location location = locationList.get(position);
holder.name.setText(location.locName);
holder.district.setText(location.locDistrict);
@Override
public int getItemCount()
return filteredLocationList.size();
@Override
public Filter getFilter()
return new Filter()
@Override
protected FilterResults performFiltering(CharSequence constraint)
String searchTerm = constraint.toString().toLowerCase();
Log.w(TAG, "search " + searchTerm);
if (searchTerm.isEmpty())
filteredLocationList = locationList;
else
List<Location> filteredList = new ArrayList<>();
for (Location location : locationList)
if (location.locName.toLowerCase().contains(searchTerm))
Log.i("location search", location.locName);
filteredList.add(location);
filteredLocationList = filteredList;
FilterResults searchResults = new FilterResults();
searchResults.values = filteredLocationList;
return searchResults;
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
filteredLocationList = (ArrayList<Location>) results.values;
notifyDataSetChanged();
;
class MyViewHolder extends RecyclerView.ViewHolder
TextView name, district;
MyViewHolder(View view)
super(view);
name = view.findViewById(R.id.name);
district = view.findViewById(R.id.district);
日志语句显示正在找到位置,但列表没有相应更新。这可能是什么原因。
【问题讨论】:
您的Adapter
是从filteredLocationList
还是locationList
中提取数据?请发布完整的课程。
两个列表都是类变量。我保留 locationList 以防搜索没有返回结果。
添加了适配器类@MikeM。
在onBindViewHolder()
中,您从locationList
提取数据,而不是filteredLocationList
。您在getItemCount()
中已经正确,但即使列表的大小可能会发生变化,所列项目的实际数据也不会发生变化。
【参考方案1】:
参考this 教程后,我对getFilter()
和publishResults()
方法进行了一些更改,这似乎已经成功了。搜索结果的值和计数是在搜索后分配的。在 publishResults 中使用了适配器getFilter()
:
searchResults.values = filteredLocationList;
searchResults.count = filteredLocationList.size();
publishResults()
:
adapter.filteredLocationList = (ArrayList<Location>) results.values;
adapter.notifyDataSetChanged();
【讨论】:
我一开始用的是androidHive教程:androidhive.info/2017/11/…以上是关于我的可过滤适配器正在查找结果但未显示的主要内容,如果未能解决你的问题,请参考以下文章
是否可以过滤数组列表中的结果,然后将该列表添加到数组适配器?
在 Array Adapter 中实现 Filterable 不会过滤任何结果 - 与过滤前相同的列表
使用自定义适配器实现过滤器的 ListView 正在获取 IndexOutOfBoundsException
Heroku构建错误:为数据库适配器指定了'sqlite3',但未加载gem