Refre sh SearchView, при изменении элемента RecyclerView - PullRequest
1 голос
/ 16 января 2020

Я борюсь с проблемой - пытаюсь обновить sh результаты поиска после удаления элемента 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();
    }
};

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Прикрепление образца: пожалуйста, обновите ваш адаптер как

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
    }
}
0 голосов
/ 16 января 2020

Весь 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();
    }
};

}

...