我的可过滤适配器正在查找结果但未显示

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

为啥 recyclerview 的 searchview 不起作用?

我正在使用融合位置 API 在回收视图适配器中查找当前位置,适配器由片段类使用