gpt4 book ai didi

具有可过滤功能的 Android PagedListAdapter

转载 作者:行者123 更新时间:2023-11-29 00:53:21 28 4
gpt4 key购买 nike

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

我做过这样的事情,但是没有用。

编辑:

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

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);
}
};
}
}

最佳答案

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

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

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

你想要的行为是可能的,但在“paged recycler”的情况下是不同的

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

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

希望对你有帮助

关于具有可过滤功能的 Android PagedListAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57390812/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com