Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android PagedListAdapter具有可过滤性_Android_Android Recyclerview_Android Paging - Fatal编程技术网

Android PagedListAdapter具有可过滤性

Android PagedListAdapter具有可过滤性,android,android-recyclerview,android-paging,Android,Android Recyclerview,Android Paging,我有一个带有搜索操作的操作栏菜单项。我有一个recyclerview,它绑定了pagedlistadapter中加载pagedlist的数据。我需要过滤适配器数据,使searchview文本更改为白色,就像我们在其他适配器中所做的那样 我做过类似的事情,但不起作用 编辑: 这是我用于适配器的完整代码 public class ProductsRvAdapter extends PagedListAdapter<Product, ProductsRvAdapter.ViewHolder>

我有一个带有搜索操作的操作栏菜单项。我有一个recyclerview,它绑定了pagedlistadapter中加载pagedlist的数据。我需要过滤适配器数据,使searchview文本更改为白色,就像我们在其他适配器中所做的那样

我做过类似的事情,但不起作用

编辑:

这是我用于适配器的完整代码

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);
        }
    };
}
}
公共类产品vAdapter扩展PagedListAdapter实现可过滤{
私人语境;
公共产品虚拟适配器(上下文){
超级(差异回调);
this.context=上下文;
}
私有静态DiffUtil.ItemCallback DIFF_CALLBACK=new DiffUtil.ItemCallback(){
@凌驾
公共布尔项相同(产品旧产品、产品新产品){
返回oldProduct.getId()==newProduct.getId();
}
@凌驾
公共布尔值是相同的内容(产品oldProduct,@NonNull产品newProduct){
返回旧产品。等于(新产品);
}
};
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){
返回新的ViewHolder(LayoutInflater.from(viewGroup.getContext())。充气(R.layout.row_item_product,viewGroup,false));
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder ViewHolder,int i){
产品=获取项目(i);
如果(产品==null){
viewHolder.clear();
}否则{
viewHolder.bind(产品);
}
}
公共类ViewHolder扩展了RecyclerView.ViewHolder{
//发表意见
公共视图持有者(@NonNull View itemView){
超级(项目视图);
//初始化视图
}
公共无效绑定(产品){
//将数据绑定到视图
}
公共空间清除(){
//清除视图数据
}
}
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
字符串查询=charSequence.toString();
PagedList filtered=null;
if(query.isEmpty()){
filtered=getCurrentList();
}否则{
用于(产品:项目列表){
if(product.getProductName().toLowerCase().contains(query.toLowerCase())){
过滤。添加(产品);
}
}
}
FilterResults results=新的FilterResults();
results.count=filtered.size();
结果.值=过滤;
返回结果;
}
@凌驾
受保护的无效发布结果(CharSequence CharSequence、FilterResults results){
submitList((PagedList)results.values);
}
};
}
}

问题是,如果您将过滤器{}应用于PagedList,您将拥有列表和

submitList((PagedList<Product>) results.values); 
submitList((PagedList)results.values);
它将崩溃,因为类型不同

你想要的行为是可能的,但在“分页回收者”的情况下是不同的

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

在paged list中,我认为,如果需要对其进行过滤,应该在数据源中添加过滤器,并使用此过滤数据源创建新的PagedList(过滤器应用于loadInitial和loadRange方法中的api或数据库调用)。因此,当它向下滚动(或加载新页面)时,您将加载筛选页面中的项目


希望对您有所帮助

@ManojPerumarath请检查我的编辑这是您的diffutil回调,arecontentsame和areitemsameare从网络或数据库提交数据?@ManojPerumarath适配器在我更改searchview中的文本时没有过滤数据。我在getfilter()端做得对吗?@ManojPerumarath好的!Bulls kathi:)嘿,伙计,你有没有关于如何过滤页面列表的代码,因为我试图找到一些关于页面列表的东西,但找不到太多,我基本上是从api获取数据,我想对其进行过滤,我设置了代码,但它会返回null对象上的livedata如果你想查看我的代码,我会为此创建一个nw任务,感谢you@takieddine看看这个: