Tom*_*m11 6 android android-room android-livedata android-viewmodel
我有LiveDataBooks inViewModel的构造函数:
LiveData<List<Book>> books;
public MyViewModel(@NonNull Application application) {
super(application);
books = bookRepository.getBooks();
}
Run Code Online (Sandbox Code Playgroud)
当用户book从 UI创建新书时,我希望属性book_order填充最多增加book_order的其他书籍。为了更好地描述我想要什么,请参阅以下 preudocode:
book.book_order = max(books.book_order) + 1;
Run Code Online (Sandbox Code Playgroud)
因此,当有三本书book_order分别为 1、2、3 时,新书会将这个属性设置为 4。
问题是,我怎么能用LiveDatain做到这一点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);
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何为新书设置增量最大值?它可以是不同于此处描述的方法的另一种方法。ViewModel创建是为了将应用程序逻辑与 UI 分开。然而,在这种情况下似乎并没有这样做,因为如果我想观察价值,我需要在Activity. 另外,我没有找到任何替代方法来执行这种从 DB 获取一个值的操作。任何帮助表示赞赏。
请注意,您的booksare livedata,因此可能会不时更改其值。
其中 yourbookMax是应在插入时计算的 单个值。
要插入您需要:
val bookList: List<Book> = books.value // current value. may be null!
val bookMax: Int = bookList.maxBy { it.order }.order // find max order
// insert
val newBooks = arrayListOf(bookList)
newBooks.add(newBook)
books.value = newBooks // update your livedata
Run Code Online (Sandbox Code Playgroud)
编辑这是Java代码
// get current value. may be null!
List<Book> bookList = books.getValue();
// so we better handle it early
if (bookList == null) {
bookList = new ArrayList<>();
}
// calculate max order
int maxOrder = -1;
for (Book book : bookList) {
if (maxOrder < book.order) {
maxOrder = book.order;
}
}
// create new book
Book newBook = new Book();
newBook.order = maxOrder + 1;
// add book to the list
bookList.add(newBook);
// do with new list whatever you want
// for example, you can update live data (if it is a MutableLiveData)
books.setValue(bookList);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9183 次 |
| 最近记录: |