Как фильтровать строки в комнате - PullRequest
1 голос
/ 26 мая 2020

Я использую Room + RecyclerView. Пользователь может пометить запись, и она переместится в список в новом действии, я сделал это с помощью логической переменной. Моя проблема в том, что я не могу составить новый список записей, которые понравились пользователю. Но мне удалось выполнить динамический c поиск, но это не то, что мне нужно.

В некоторых случаях я вызываю метод getFilter для динамического поиска по всему списку. Теперь мне нужно создать новый список, который будет содержать только те записи, которые помечены пользователем.

 public class ReceptAdapter extends RecyclerView.Adapter<ReceptAdapter.NoteHolder> implements Filterable {
private List<Recept> recepts = new ArrayList<>();
private List<Recept> receptsFull;
private List<Recept> receptsChecked;
private OnItemClickListener listener;

@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.recept_ingred_item, parent, false);
    return new NoteHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull NoteHolder holder, int position) {
    Recept currentRecept= recepts.get(position);
    holder.textViewTitle.setText(currentRecept.getTitle());
}

@Override
public int getItemCount() {
    return recepts.size();
}

public void setRecepts(List<Recept> recepts) {
    this.recepts = recepts;
    receptsFull = new ArrayList<>(recepts);
    receptsChecked = new ArrayList<>(recepts);
    notifyDataSetChanged();
}



public Recept getNoteAt(int position) {
    return recepts.get(position);
}



class NoteHolder extends RecyclerView.ViewHolder {
    private TextView textViewTitle;

    public NoteHolder(View itemView) {
        super(itemView);
        textViewTitle = itemView.findViewById(R.id.text_view_title);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (listener != null && position != RecyclerView.NO_POSITION) {
                    listener.onItemClick(recepts.get(position));
                }
            }
        });
    }
}

public interface OnItemClickListener {
    void onItemClick(Recept recept);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    this.listener = listener;
}






//filtered


@Override
public Filter getFilter() {
    return receptFilter;
}

private Filter receptFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<Recept> filteredList = new ArrayList<>();
        if (constraint == null || constraint.length() == 0){
            filteredList.addAll(receptsFull);
        } else {
            String filterPattern = constraint.toString().toLowerCase().trim();

            for (Recept item : receptsFull){
                if (item.getTitle().toLowerCase().contains(filterPattern)){
                    filteredList.add(item);
                }
            }
        }
        FilterResults results = new FilterResults();
        results.values = filteredList;

        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        recepts.clear();
        recepts.addAll((List) results.values);
        notifyDataSetChanged();


    }
};

Выбор должен производиться по полю - логическое значение;

1 Ответ

0 голосов
/ 26 мая 2020

Надеюсь, я правильно понял вопрос. Вам нужен способ запроса Room, основанный на заданном атрибуте c. Тогда вы должны использовать следующее:

@Query("SELECT * FROM table_name WHERE 'like'=1")
fun loadFiltered(): List<DesiredObject>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...