Android 可过滤的 PagedListAdapter
Android PagedListAdapter with filterable
我有一个带有搜索操作的操作栏菜单项。我有一个 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);
}
};
}
}
问题是,如果您将过滤器 {} 应用于 PagedList,您将拥有 List,并且在
submitList((PagedList<Product>) results.values);
类型不同会崩溃
你想要的行为是可能的,但在 "paged recycler"
的情况下是不同的
在简单的 RecyclerView 中加载 "store" 数据以便过滤。
如果用户更改页面或向下滚动,您只需添加更多数据,然后再次过滤它(但您还必须使用应用过滤器从服务器获取并添加适配器数据,以防它们不存在于适配器中)。
在分页列表中,在我看来,如果你需要过滤它,你应该在你的数据源中添加过滤器并使用这个过滤后的数据源创建新的 PagedList(过滤器应用于 api 或在 loadInitial 中调用数据库和 loadRange 方法)。因此,当它向下滚动(或加载新页面)时,您将从过滤页面加载项目。
希望对您有所帮助
我有一个带有搜索操作的操作栏菜单项。我有一个 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);
}
};
}
}
问题是,如果您将过滤器 {} 应用于 PagedList,您将拥有 List,并且在
submitList((PagedList<Product>) results.values);
类型不同会崩溃
你想要的行为是可能的,但在 "paged recycler"
的情况下是不同的在简单的 RecyclerView 中加载 "store" 数据以便过滤。 如果用户更改页面或向下滚动,您只需添加更多数据,然后再次过滤它(但您还必须使用应用过滤器从服务器获取并添加适配器数据,以防它们不存在于适配器中)。
在分页列表中,在我看来,如果你需要过滤它,你应该在你的数据源中添加过滤器并使用这个过滤后的数据源创建新的 PagedList(过滤器应用于 api 或在 loadInitial 中调用数据库和 loadRange 方法)。因此,当它向下滚动(或加载新页面)时,您将从过滤页面加载项目。
希望对您有所帮助