[英]Refresh SearchView, when changing RecyclerView item
我正在努力解決一個問題 - 在 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();
}
};
}
附加示例:請將您的適配器更新為
public class ListAdapter extends RecyclerView.Adapter<ListViewHolder> implements
Filterable {
private List<Status> statusList;
private List<Status> statusListFiltered;
private OnClickActionListener listener;
public ListAdapter(List<Status> statusList,
OnClickActionListener listener) {
this.statusList = statusList;
this.statusListFiltered = statusList;
this.listener = listener;
}
@Override
public void onBindViewHolder(@NonNull ListViewHolder holder, int position) {
Status status = statusListFiltered.get(position);
holder.cellListBinding.setStatus(status);
}
@Override
public int getItemCount() {
if (statusListFiltered != null) {
return statusListFiltered.size();
} else {
return 0;
}
}
@Override
public int getItemViewType(int position) {
return position;
}
@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
CellListBinding binding = DataBindingUtil
.inflate(LayoutInflater.from(parent.getContext()), R.layout.cell_list,
parent, false);
return new ListViewHolder(binding);
}
/**
* Reloads list of rooms.
*/
public void loadRooms(List<Status> roomsList) {
this.statusList = roomsList;
this.statusListFiltered = roomsList;
notifyDataSetChanged();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
statusListFiltered = statusList;
} else {
List<Status> filteredList = new ArrayList<>();
for (Status row : statusList) {
if (row.getStatusName().toLowerCase().contains(charString.toLowerCase()) {
filteredList.add(row);
}
}
statusListFiltered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = statusListFiltered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
if (filterResults.values instanceof RealmList) {
statusListFiltered = (RealmList<Status>) filterResults.values;
} else {
statusListFiltered = (ArrayList<Status>) filterResults.values;
}
notifyDataSetChanged();
}
};
}
class ListViewHolder extends RecyclerView.ViewHolder implements OnClickListener {
// Your Code
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.