android - 带有自定义模型的 Android ViewModel
问题描述
我打算有一个模型类并通过 Android ViewModel 提供这个模型的一个实例。ViewModel 中的实例可以在应用程序生命周期中发生变化。
我现在的想法是这样的:
public class Book {
private MutableLiveData<String> mName = new MutableLiveData<>();
public Book(...) {
...
}
public LiveData<String> getName() {
return mName;
}
public void setName(String name) {
mName.setValue(name);
}
}
public class MyViewModel extends ViewModel {
private MutableLiveData<Book> mCurrentBook = new MutableLiveData<>();
private MutableLiveData<Book> mRecommendedBook = new MutableLiveData<>();
public LiveData<Book> getCurrentBook() {
return mCurrentBook;
}
public void setCurrentBook(Book book) {
mCurrentBook.setValue(book);
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getCurrentBook().observe(this, book -> {
book.getName().observe(this, name -> {
// update UI
});
});
...
model.setCurrentBook(someOtherBook);
}
}
这是一个好方法吗?我不确定将 LiveData 嵌套在另一个类中是否是个好主意。
每次书籍更改时,我为书名创建一个新的观察者也可能是一个问题吗?
解决方案
我在这里回答了一个类似的问题
您应该使用Transformation在观察者之间传输数据。
推荐阅读
- node.js - 通过 HTTPS 在 NodeJS 后端上的 Angular
- java - 如何在 JavaFx 中使表格视图的每个单元格可编辑
- jquery - JQuery Rails 更新属性不起作用
- python - 如何在 sqlalchemist Python 的 ORM 中构建这个 postgresql 查询?
- wordpress - Wordpress 联系表 7 标签不会被替换
- php - 将播放时间格式 PT 转换为 M:SS
- laravel-5 - Laravel 通过模型将 json 类型的列数据插入到 db
- java - Java8:通过键将流收集到SortedMap中
- linux - 在不使用 sleep 命令的情况下查找长时间运行的作业的经过时间或持续时间
- azure - 在 AAD 中注册的应用程序被拒绝 Azure 存储帐户访问