Ras*_*hiq 3 android android-recyclerview android-paging
我有一个带有搜索操作的操作栏菜单项。我有一个 recyclerview,它绑定来自加载 pagedlist 的 pagedlistadapter 的数据。我需要过滤适配器数据白色搜索视图文本更改,就像我们在其他适配器中所做的那样
我已经做了类似的事情,但它不起作用。
编辑:
这是我用于适配器的完整代码
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);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果您将过滤器 {} 应用于 PagedList,您将拥有 List 并在
submitList((PagedList<Product>) results.values);
Run Code Online (Sandbox Code Playgroud)
它会崩溃,因为类型不同。
您想要的行为是可能的,但在“分页回收器”的情况下有所不同
在简单的 RecyclerView 中,您加载并“存储”数据,以便您可以过滤它。如果用户更改页面或向下滚动,您只需添加更多数据,然后再次过滤它(但您还必须使用应用的过滤器从服务器获取并添加适配器数据,以防它们不存在于适配器中)。
在我看来,在分页列表中,如果您需要对其进行过滤,则应该在 DataSource 中添加过滤器,并使用此过滤后的数据源创建新的 PagedList(过滤器应用于 loadInitial 和 loadRange 方法中的 api 或数据库调用)。因此,当它向下滚动(或加载新页面)时,您将从过滤页面加载项目。
希望它会有所帮助
| 归档时间: |
|
| 查看次数: |
3003 次 |
| 最近记录: |