java - 如何更新 ListItem (LiveData) 的字段
问题描述
如何更新 ListItem 的字段?
我有以下 POJO 和 ViewModel 类。目前我正在从 LiveData 对象获取完整列表,然后更新其数据,然后重新设置 LiveData 对象的值,但我认为这不是正确的方法,因为只更新我拥有的一本书的名称重置完整的 LiveData 对象。
任何其他建议或良好做法以正确的方式做到这一点?
public class Book {
private long id;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class BookProvider extends AndroidViewModel {
private final MutableLiveData<List<Book>> booksData;
public BookProvider(@NonNull Application application) {
super(application);
booksData = new MutableLiveData<>();
}
public LiveData<List<Book>> getBooksData() {
return booksData;
}
public void updateBookName(int position, String name) {
final List<Book> books = booksData.getValue();
if (books != null && books.size() > position) {
books.get(position).setName(name);
}
booksData.setValue(books);
}
}
解决方案
LiveData
只是一个容器,其中包含对您的数据的引用并通知可能的观察者更改。因此,就LiveData
您而言,这是您能做的最好的事情。
但是LiveData
不支持分子更改,因此每次更改都可能导致整个列表无效并重新绘制。如果数据有很多变化(如实时应用程序),强烈建议您使用不同的方法。
推荐阅读
- python - 为什么 Pycharm IDE 在运行小游戏时会这么慢?
- javascript - Uncaught (in promise) TypeError: selfHook.call is not a function
- mysql - 为什么 UPDATE answertable SET Ans-Farsi-value = `خیلی ناراضی` WHERE Ans-value =`Very Dissatisfied' 生成 1064 错误;
- c# - 有没有办法将不同类型的数组传递给接口实现
- java - 带有JDK11客户端的https代理
- python - 为什么 pandas apply() 函数的行为在 pandas 1.1 中发生了变化?
- c# - 试图从数据库绑定下拉列表得到错误
- java - 如何从 Java 执行安装在 Python 虚拟环境中的 Python 工具
- c# - Azure.Messaging.EventHubs 与 WindowsAzure.ServiceBus 产生的消息有区别吗?
- amazon-web-services - VPC 的本地等价物