当前位置: 首页 > 知识库问答 >
问题:

如何使用LiveData正确更新Android的RecyclerView?

后安民
2023-03-14

假设的例子

假设如下...

我的LiveData类如下所示:

public class ArticleViewModel extends ViewModel {

    private final MutableLiveData<List<Article>> mArticles = new MutableLiveData<>();

}
public class ArticleRecyclerViewAdapater extends RecyclerView.Adapter<Article> {

    private final ArrayList<Article> mValues = new ArrayList<>();


    public void resetValues(Collection<Article> articles) {
        mValues.clear();
        mValues.addAll(articles);
        notifyDataSetChanged();
    }
}
public void deleteArticle(int index) {
    final List<Article> articles = mArticles.getValue();
    articles.remove(index);
    mArticles.setValue(articles);
}

同样,这不是真的很低效吗,因为它会在recyclerView.adapter中触发完全刷新吗?

共有1个答案

孔宇
2023-03-14

案例1:

当您添加或删除列表中的元素时,您不会更改列表项的引用,所以每次修改liveData项时,您必须通过调用setValue方法(如果您是在主线程上更新项)或Post value(如果您是在后台线程上更新值)来更新live data值

问题是效率不高

LiveData只会在顶级值已更改时通知观察者更改。但是,对于复杂对象,这意味着仅当对象引用发生更改时,而不是当对象的某些属性发生更改时。

解决方案

要观察属性的更改,您需要PropertyAwareMutableLiveData

class PropertyAwareMutableLiveData<T: BaseObservable>: MutableLiveData<T>() {
private val callback = object: Observable.OnPropertyChangedCallback() {
    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        value = value
    }
}
override fun setValue(value: T?) {
    super.setValue(value)

    value?.addOnPropertyChangedCallback(callback)
}
}
 类似资料:
  • 在我的片段中,我观察到db问卷列表字段: 在我的片段中,我有几个按钮,根据哪个按钮被按下,我在viewModel上调用方法,将设置为标签的字符串传递给按钮。 我的视图模式: 存储库方法: Dao方法: 当我按下按钮时,viewModel方法被调用,并带有参数,该参数应该用于通过搜索房间数据库来更新LiveData,但没有任何内容会被无缘无故地更新。数据库不是空的,所以没有理由在主片段中返回null

  • 在RoomDatabase中创建数据库时,一切工作都很好,并且数据已成功加载,但是,我需要更新服务中生成的数据,问题是它需要下一行中的活动上下文: Dao接口: 存储库: 服务: 我希望服务在LiveData列表中执行、保存和刷新新结果,但我不能声明LiveData列表。

  • 我已经阅读了尽可能多的关于如何在MongoDB中正确更新数组中的元素的文章(比如这篇:Mongoose,更新对象数组中的值),并认为我已经遵循了所有的建议,但我仍然犯了错误,如果有人能发现我的错误,我将非常感激,因为我已经试着调试了几个小时! 我特别遇到的问题是findOneAndUpdate调用似乎只是更新“inventureItems”数组中的第一个元素,不管它是否匹配我对特定元素的查询。 我

  • 活动可以按以下方式访问此列表: 我的问题是,我要这样做: > 在函数中,我异步获取数据,首先检查数据库(房间)中的数据

  • 问题内容: 我试图: 根据搜索条件查找文档, 如果找到,请更新一些属性 如果没有插入带有某些属性的文档。 我正在使用,因为我也在执行单个插入操作。我想在一次操作中完成所有操作。 但是,它什么都不会导致为更新/向上插入操作插入任何内容。 这是插入文档: 这是最新资料: 这就是我试图更新/更新的方式: 为什么不更新/更新呢? 注意 那是使用水线ORM的JS代码,它也使用mongodb本机驱动程序。 问

  • 我正在尝试创建一个SNMP4j代理,但发现很难正确理解该过程。我已经成功创建了一个可以使用snmpwalk从命令行查询的代理。我遇到的困难是理解如何更新存储在我实现的MIB中的值。 下面显示了我用于创建MIB的相关代码(我实现了主机资源MIB) 这似乎足以创建可运行的代理。我不明白的是,我应该如何更改MIB中存储的值(例如,如何更改HrSWRunStatus的值)。似乎有一些乱七八糟的方法,但它们