簡體   English   中英

刷新 SearchView,更改 RecyclerView 項時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM