java - 更改 RecyclerView 项时刷新 SearchView
问题描述
我正在努力解决一个问题 - 在 RecyclerView 项目被删除后尝试刷新搜索结果。
现在,当我过滤掉项目并删除其中一个时,RecyclerView 会再次显示所有其他项目,而没有应用搜索过滤器。但是如何实现搜索过滤器,即使在 RecyclerView 列表发生变化时它仍然存在?
这就是我在主要活动中加载数据的方式:
private void loadData(final int ordernumber) {
orderLineViewModel.getAllUnCheckedSingleOrderLines(ordernumber).observe(this, new Observer<List<OrderLine>>() {
@Override
public void onChanged(List<OrderLine> orderLines) {
orderLineListAdapter.setOrderLines(orderLines);
}
});
}
这是我在主要活动中的 SearchView 代码:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
orderLineListAdapter.getFilter().filter(s);
return false;
}
@Override
public boolean onQueryTextChange(String s) {
orderLineListAdapter.getFilter().filter(s);
return false;
}
});
这是我在 RecyclerViewAdapter 中的过滤器:
public void setOrderLines(List<OrderLine> orderLines) {
orderLineList = orderLines;
orderLineListFull = new ArrayList<>(orderLines);
notifyDataSetChanged();
}
@Override
public Filter getFilter() {
return orderFilter;
}
private Filter orderFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
List<OrderLine> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0){
filteredList.addAll(orderLineListFull);
}else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (OrderLine orderLine: orderLineListFull){
if (orderLine.getProductCode().toLowerCase().contains(filterPattern)){
filteredList.add(orderLine);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
orderLineList.clear();
orderLineList.addAll((List)filterResults.values);
notifyDataSetChanged();
}
};
在 RecyclerView 项目中按下复选框:
@Override
public void onClick(View view) {
int position = getAdapterPosition();
OrderLine line = orderLineList.get(position);
switch (view.getId()) {
case R.id.foam_in_checkbox:
if (okCheckBox.isChecked()) {
line.setIsArrived(1);
orderLineViewModel.update(line);
orderLineList.remove(position);
notifyItemRemoved(position);
} else {
line.setIsArrived(0);
orderLineViewModel.update(line);
}
break;
}
}
编辑:添加了整个 RecyclerViewAdapter:
public class OrderLineListAdapter extends
RecyclerView.Adapter<OrderLineListAdapter.OrderLineViewHolder> implements Filterable {
private Context context;
private final LayoutInflater orderLineInflater;
private List<OrderLine> orderLineList;
private List<OrderLine> orderLineListFull;
private OrderLineViewModel orderLineViewModel;
public OrderLineListAdapter(Context context) {
this.context = context;
orderLineInflater = LayoutInflater.from(context);
orderLineViewModel = ViewModelProviders.of((FoamInActivity) context).get(OrderLineViewModel.class);
}
@NonNull
@Override
public OrderLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = orderLineInflater.inflate(R.layout.foam_in_single_line, parent, false);
return new OrderLineViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull OrderLineViewHolder orderLineViewHolder, int position) {
if (orderLineList != null) {
OrderLine current = orderLineList.get(position);
orderLineViewHolder.productCodeTextView.setText(current.getProductCode());
orderLineViewHolder.orderedQuantityTextView.setText(String.valueOf(current.getOrderedQuantity()));
orderLineViewHolder.okCheckBox.setOnCheckedChangeListener(null);
orderLineViewHolder.okCheckBox.setChecked(false);
} else {
orderLineViewHolder.productCodeTextView.setText(R.string.no_open_positions);
}
}
public void setOrderLines(List<OrderLine> orderLines) {
orderLineList = orderLines;
orderLineListFull = new ArrayList<>(orderLines);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (orderLineList != null) {
return orderLineList.size();
} else {
return 0;
}
}
public class OrderLineViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView productCodeTextView, orderedQuantityTextView;
public CheckBox okCheckBox;
public OrderLineViewHolder(@NonNull View itemView) {
super(itemView);
productCodeTextView = itemView.findViewById(R.id.foam_in_product_code);
orderedQuantityTextView = itemView.findViewById(R.id.foam_in_quantity);
okCheckBox = itemView.findViewById(R.id.foam_in_checkbox);
okCheckBox.setOnClickListener(this);
productCodeTextView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int position = getAdapterPosition();
OrderLine line = orderLineList.get(position);
switch (view.getId()) {
case R.id.foam_in_checkbox:
if (okCheckBox.isChecked()) {
line.setIsArrived(1);
orderLineViewModel.update(line);
orderLineList.remove(position);
notifyItemRemoved(position);
} else {
line.setIsArrived(0);
orderLineViewModel.update(line);
}
break;
case R.id.foam_in_product_code:
Toast.makeText(context, "Status: " + line.getIsArrived(), Toast.LENGTH_SHORT).show();
break;
}
}
}
@Override
public Filter getFilter() {
return orderFilter;
}
private Filter orderFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
List<OrderLine> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0){
filteredList.addAll(orderLineListFull);
}else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (OrderLine orderLine: orderLineListFull){
if (orderLine.getProductCode().toLowerCase().contains(filterPattern)){
filteredList.add(orderLine);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
orderLineList.clear();
orderLineList.addAll((List)filterResults.values);
notifyDataSetChanged();
}
};
解决方案
整个 RecyclerViewAdapter:
public class OrderLineListAdapter extends RecyclerView.Adapter<OrderLineListAdapter.OrderLineViewHolder> implements Filterable {
private Context context;
private final LayoutInflater orderLineInflater;
private List<OrderLine> orderLineList;
private List<OrderLine> orderLineListFull;
private OrderLineViewModel orderLineViewModel;
public OrderLineListAdapter(Context context) {
this.context = context;
orderLineInflater = LayoutInflater.from(context);
orderLineViewModel = ViewModelProviders.of((FoamInActivity) context).get(OrderLineViewModel.class);
}
@NonNull
@Override
public OrderLineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = orderLineInflater.inflate(R.layout.foam_in_single_line, parent, false);
return new OrderLineViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull OrderLineViewHolder orderLineViewHolder, int position) {
if (orderLineList != null) {
OrderLine current = orderLineList.get(position);
orderLineViewHolder.productCodeTextView.setText(current.getProductCode());
orderLineViewHolder.orderedQuantityTextView.setText(String.valueOf(current.getOrderedQuantity()));
orderLineViewHolder.okCheckBox.setOnCheckedChangeListener(null);
orderLineViewHolder.okCheckBox.setChecked(false);
} else {
orderLineViewHolder.productCodeTextView.setText(R.string.no_open_positions);
}
}
public void setOrderLines(List<OrderLine> orderLines) {
orderLineList = orderLines;
orderLineListFull = new ArrayList<>(orderLines);
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (orderLineList != null) {
return orderLineList.size();
} else {
return 0;
}
}
public class OrderLineViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView productCodeTextView, orderedQuantityTextView;
public CheckBox okCheckBox;
public OrderLineViewHolder(@NonNull View itemView) {
super(itemView);
productCodeTextView = itemView.findViewById(R.id.foam_in_product_code);
orderedQuantityTextView = itemView.findViewById(R.id.foam_in_quantity);
okCheckBox = itemView.findViewById(R.id.foam_in_checkbox);
okCheckBox.setOnClickListener(this);
productCodeTextView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int position = getAdapterPosition();
OrderLine line = orderLineList.get(position);
switch (view.getId()) {
case R.id.foam_in_checkbox:
if (okCheckBox.isChecked()) {
line.setIsArrived(1);
orderLineViewModel.update(line);
orderLineList.remove(position);
notifyItemRemoved(position);
} else {
line.setIsArrived(0);
orderLineViewModel.update(line);
}
break;
case R.id.foam_in_product_code:
Toast.makeText(context, "Status: " + line.getIsArrived(), Toast.LENGTH_SHORT).show();
break;
}
}
}
@Override
public Filter getFilter() {
return orderFilter;
}
private Filter orderFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
List<OrderLine> filteredList = new ArrayList<>();
if (charSequence == null || charSequence.length() == 0){
filteredList.addAll(orderLineListFull);
}else {
String filterPattern = charSequence.toString().toLowerCase().trim();
for (OrderLine orderLine: orderLineListFull){
if (orderLine.getProductCode().toLowerCase().contains(filterPattern)){
filteredList.add(orderLine);
}
}
}
FilterResults results = new FilterResults();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
orderLineList.clear();
orderLineList.addAll((List)filterResults.values);
notifyDataSetChanged();
}
};
}
推荐阅读
- haskell - 不在范围内:类型构造函数或类 '~'
- java - 调试 android 应用程序时出现此错误是什么?
- redux-toolkit - Redux Toolkit 查询:从“突变”响应中减少状态
- c# - 缓存大量数据的字典替代方案?
- mongodb - MongoDB查询多个数据库与集合
- mysql - 尝试在 MySQL 中使用子查询来压缩查询
- javascript - 尝试从 Promise 获取和传递数据的问题
- excel - Powershell 和 .xlsx 如何使用 =PROPER()
- json - 如果没有指定键,如何在 jq 中打印给定条件的数组的特定值
- python - 对于 A 列中的每个值,B 列中应该只有一个值 - Pandas