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