如果搜索查询在搜索视图中不匹配,如何为回收器视图设置过滤器

时间:2015-02-05 05:40:53

标签: android searchview android-recyclerview

如果我们在搜索视图中输入的项目匹配,但是如果我们输入一些不匹配的查询,则此代码正常工作...应用程序在android中崩溃。

这里Main_ATMItemList是返回整个结果列表的列表。 请帮助我添加我需要添加的内容,以便即使查询不匹配也可以使用代码。

我在适配器类

中创建了此方法
public void setFilter(String queryText) {
        visibleObjects = new ArrayList<>();

            for (RouteByATMList.Route_ATM item : Main_ATMItemList) {
                if (item.ATMNumber.startsWith(queryText))
                {
                    visibleObjects.add(item);

                }
            }
        }

        notifyDataSetChanged();
        Log.e("dataset changed","dataset changed");
    }

2 个答案:

答案 0 :(得分:2)

您需要抽象RecyclerView.Adapter并使其继承Filterable。然后,将此抽象子类化为要创建的适配器。

覆盖getFilter()方法以实例化Filter。请参阅示例如何过滤适配器并移动您现在拥有的逻辑,使用performFiltering(String constraint)

Filter方法

您应该在后台线程中进行过滤,因此FilterableFilterable对后台线程进行过滤,并将结果传递给调用过滤的UI线程或线程。

像这样,你可以与旧的ListView达到某种程度的兼容性。

评论中有人问道:

public abstract class BaseFilterableRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> implements Filterable {

    private Context mContext;
    public BaseFilterableRecyclerViewAdapter(Context context) {
        this.mContext = context;
    }
    public abstract void sort(SortingFilter.Sort sortingStrategy);

}

在扩展类中:

public class ProductAdapter extends BaseFilterableRecyclerViewAdapter<RecyclerView.ViewHolder>{

//------- Other methods ----

    @Override
    public Filter getFilter() {
        return new SortingFilter(mData) {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                if (results.values != null) {
                    int last = mData.size();
                    mData = (List<? extends Product>) results.values;
                    notifyItemRangeChanged(mHeaderView == null ? 0 : 1, last);
                }
            }
        };
    }


}

答案 1 :(得分:0)

一直使用此功能

constructor(cronTime, onTick, onComplete, start, timezone, context)

然后onQueryTextChange(String query)调用过滤器

private List<ExampleModel> filter(List<ExampleModel> models, String query) {
    query = query.toLowerCase();

    final List<ExampleModel> filteredModelList = new ArrayList<>();
    for (ExampleModel model : models) {
        final String text = model.getText().toLowerCase();
        if (text.contains(query)) {
            filteredModelList.add(model);
        }
    }
    return filteredModelList;
}
下面的

是适配器

中的animateTo方法
final List<ExampleModel> filteredModelList = filter(mModels, query);
        mAdapter.animateTo(filteredModelList);
        mRecyclerView.scrollToPosition(0);

}