【问题标题】:Android PagedListAdapter with filterable可过滤的 Android PagedListAdapter
【发布时间】:2019-08-07 09:08:51
【问题描述】:

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

【问题讨论】:

  • @ManojPerumarath 请检查我的编辑
  • 你的 diffutil 回调在哪里,arecontentsame 和 areitemsame
  • 数据来自网络还是数据库?
  • @ManojPerumarath 适配器没有过滤数据,因为我更改了 searchview 中的文本。我在 getfilter() 方面做得对吗?
  • @ManojPerumarath 好的,兄弟!灯泡卡西 :)

标签: android android-recyclerview android-paging


【解决方案1】:

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

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

它会因为类型不同而崩溃。

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

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

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

希望对你有帮助

【讨论】:

  • 嘿伙计,你有任何关于如何过滤pagedlist的代码吗,因为我正在尝试找到一些关于但找不到太多的东西,我基本上是从api获取数据,我想过滤它,我设置了代码,但是如果你想查看我的代码,它会返回 null 对象上的 livedata,我会为此创建一个 nw 任务,谢谢
  • @takieddine 看看这个:blog.usejournal.com/…
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
相关资源
最近更新 更多