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