У меня есть активность, где пользователи могут видеть все заметки в RecyclerView.Я загружаю эти заметки как
LiveData<List<Note>>
, используя ViewModel с базой данных Android Room, поэтому, если пользователь редактирует заметку, изменения немедленно отражаются.
Entity - Note.class
@Entity(tableName = "note_table")
public class Note {
@PrimaryKey(autoGenerate = true)
private int id;
private String title;
private ArrayList<String> labels;
public Note(String title, ArrayList<String> labels) {
this.title = title;
this.labels = labels;
}
public ArrayList<String> getLabels() { return labels; }
public void setLabels(ArrayList<String> labels) { this.labels = labels; }
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}
MainActivity.class
noteViewModel = ViewModelProviders.of(this).get(NoteViewModel.class);
noteViewModel.getAllNotes().observe(this, new Observer<List<Note>>() {
@Override
public void onChanged(List<Note> notes) {
adapter.submitList(notes);
}
});
У меня также есть навигационный ящик.Существует список меток, которые пользователь создает и может нажать на них.Например, заметка может иметь одну метку: «to-do» или несколько: «список покупок» и «работа».Пользователь может затем установить эти метки для заметки.Если щелкнуть ярлык, то RecyclerView следует отфильтровать для заметок с этим ярлыком.
Например, пользователь нажимает «работа»
noteViewModel.setFilterAllData("work");
В NoteViewModel:
public class NoteViewModel extends AndroidViewModel {
private NoteRepository repository;
private LiveData<List<Note>> allNotes;
private MutableLiveData<Property> filterAllData = new MutableLiveData<>();
public NoteViewModel(@NonNull Application application) {
super(application);
repository = new NoteRepository(application);
allNotes = Transformations.switchMap(filterAllData, new Function<Property, LiveData<List<Note>>>() {
@Override
public LiveData<List<Note>> apply(Property input) {
return repository.filterAll(input);
}
});
}
void setFilterAllData(String labelName) {filterAllData.setValue(labelName);}
public long insert(Note note) { return repository.insert(note); }
public void update(Note note) { repository.update(note); }
public void delete(Note note) { repository.delete(note); }
LiveData<Note> getNote(int id) { return repository.getNote(id); }
В NoteRepository.class
LiveData<List<Note>> filterAll(String label) {
return noteDao.getNotesWLabel(label);
}
Dao - NoteDao.class
@Dao
public interface NoteDao {
@Insert
long insert(Note note);
@Update
void update(Note note);
@Delete
void delete(Note note);
@Query("SELECT * FROM note_table")
LiveData<List<Note>> getAllNotes();
@Query("SELECT * FROM note_table WHERE :label IN (labels)")
LiveData<List<Note>> getNotesWLabel(String label);
Я попытался добавить преобразователи типов, как предлагается здесь: https://stackoverflow.com/a/45071364/4673960, но когда я фильтруюдля ярлыка просмотрщик пуст.