У меня LiveData
для книг в конструкторе ViewModel
:
LiveData<List<Book>> books;
public MyViewModel(@NonNull Application application) {
super(application);
books = bookRepository.getBooks();
}
Когда пользователь создает новый book
из пользовательского интерфейса, я хочу, чтобы атрибут book_order
был заполнен увеличенным максимумом book_order
других книг. Чтобы лучше описать то, что я хочу, см. Следующий предварительный код:
book.book_order = max(books.book_order) + 1;
Поэтому, когда есть три книги с book_order
1, 2, 3 соответственно, для новой книги этот атрибут будет установлен на 4.
Вопрос в том, как это сделать с LiveData
в ViewModel
? Я пробовал использовать Transformations.map
с новым LiveData
, но этот подход вообще не работает, bookMax
кажется null
.
public void insertBook(Book book) {
LiveData<Integer> bookMax = Transformations.map(books,
list -> {
int value = 0;
for(Book b: list) {
if (value < b.getBookOrder()) {
value = b.getBookOrder();
}
}
}
);
book.setBookOrder(bookMax + 1)
bookRepository.update(book);
}
Есть идеи, как установить увеличенный максимум для новой книги? Это может быть другой подход, нежели описанный здесь. ViewModel
был создан для отделения логики приложения от пользовательского интерфейса. Однако в данном случае, похоже, этого не происходит, потому что, если я хочу наблюдать значение, мне нужно быть в Activity
. Кроме того, я не нашел альтернативы, как получить одно значение из БД. Любая помощь приветствуется.
Book
. Для меня функциональностьbook_order
может быть полностью заменена идентификатором модели. А при работе сLiveData
вы можете подписать свое Activity наViewModel
, который имеет ссылку на вашLiveData
, который должен автоматически отображать все книги в вашем главном макете потока Master-Detail. Сообщите мне, может ли что-то подобное сработать, и я отправлю ответ с некоторым кодом - person ravi   schedule 23.04.2019