如果我们在搜索视图中输入的项目匹配,但是如果我们输入一些不匹配的查询,则此代码正常工作...应用程序在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");
}
答案 0 :(得分:2)
您需要抽象RecyclerView.Adapter
并使其继承Filterable
。然后,将此抽象子类化为要创建的适配器。
覆盖getFilter()
方法以实例化Filter
。请参阅示例如何过滤适配器并移动您现在拥有的逻辑,使用performFiltering(String constraint)
Filter
方法
您应该在后台线程中进行过滤,因此Filterable
。 Filterable
对后台线程进行过滤,并将结果传递给调用过滤的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);
}