我有一个带有搜索操作的操作栏菜单项。我有一个recyclerview绑定从pagedlistadapter加载加载pagedlist的数据。我需要像在其他适配器中所做的那样,将搜索视图文本更改后的适配器数据过滤为白色
我已经做了类似的事情,但是没有用。
编辑:
这是我用于适配器的完整代码
public class ProductsRvAdapter extends PagedListAdapter<Product, ProductsRvAdapter.ViewHolder> implements Filterable {
private Context context;
public ProductsRvAdapter(Context context) {
super(DIFF_CALLBACK);
this.context = context;
}
private static DiffUtil.ItemCallback<Product> DIFF_CALLBACK = new DiffUtil.ItemCallback<Product>() {
@Override
public boolean areItemsTheSame(Product oldProduct, Product newProduct) {
return oldProduct.getId() == newProduct.getId();
}
@Override
public boolean areContentsTheSame(Product oldProduct, @NonNull Product newProduct) {
return oldProduct.equals(newProduct);
}
};
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new ViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_item_product, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
Product product = getItem(i);
if (product == null) {
viewHolder.clear();
} else {
viewHolder.bind(product);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
//declare views
public ViewHolder(@NonNull View itemView) {
super(itemView);
//initialize views
}
public void bind(Product product) {
//bind data to views
}
public void clear() {
//clear views data
}
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String query = charSequence.toString();
PagedList<Product> filtered = null;
if (query.isEmpty()) {
filtered = getCurrentList();
} else {
for (Product product : itemList) {
if (product.getProductName().toLowerCase().contains(query.toLowerCase())) {
filtered.add(product);
}
}
}
FilterResults results = new FilterResults();
results.count = filtered.size();
results.values = filtered;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults results) {
submitList((PagedList<Product>) results.values);
}
};
}
}
答案 0 :(得分:1)
问题是,如果将过滤器{}应用于PagedList,则将具有List,并且在
中submitList((PagedList<Product>) results.values);
由于类型不同,它将崩溃。
您想要的行为是可能的,但是在“页面回收器”的情况下却有所不同
您可以在简单的RecyclerView中加载数据并将其“存储”在其中,以便进行过滤。 如果用户更改页面或向下滚动,则只需添加更多数据,然后再次对其进行过滤(但如果适配器中还不存在适配器数据,则还必须从服务器中获取并添加带有应用过滤器的适配器数据)。
我认为,在分页列表中,如果需要过滤它,则应在DataSource中添加过滤器,并使用此过滤后的数据源创建新的PagedList(过滤器应用于loadInitial和loadRange方法中的api或数据库调用)。因此,当它向下滚动(或加载新页面)时,您将从已过滤页面加载项目。
希望对您有帮助