具有可过滤功能的Android PagedListAdapter

时间:2019-08-07 09:08:51

标签: android android-recyclerview recycler-adapter android-paging

我有一个带有搜索操作的操作栏菜单项。我有一个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);
        }
    };
}
}

1 个答案:

答案 0 :(得分:1)

问题是,如果将过滤器{}应用于PagedList,则将具有List,并且在

submitList((PagedList<Product>) results.values); 

由于类型不同,它将崩溃。

您想要的行为是可能的,但是在“页面回收器”的情况下却有所不同

您可以在简单的RecyclerView中加载数据并将其“存储”在其中,以便进行过滤。 如果用户更改页面或向下滚动,则只需添加更多数据,然后再次对其进行过滤(但如果适配器中还不存在适配器数据,则还必须从服务器中获取并添加带有应用过滤器的适配器数据)。

我认为,在分页列表中,如果需要过滤它,则应在DataSource中添加过滤器,并使用此过滤后的数据源创建新的PagedList(过滤器应用于loadInitial和loadRange方法中的api或数据库调用)。因此,当它向下滚动(或加载新页面)时,您将从已过滤页面加载项目。

希望对您有帮助