【问题标题】:How can i update a field of a ListItem (LiveData)如何更新 ListItem (LiveData) 的字段
【发布时间】:2018-10-09 13:51:44
【问题描述】:

如何更新 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 来源 setValue() 方法并不昂贵:它只是设置参考,所以你不必担心

标签: java android mvvm viewmodel android-livedata


【解决方案1】:

LiveData 只是一个容器,其中包含对您的数据的引用,并通知可能的观察者发生变化。所以就LiveData 而言,这是你能做的最好的。

但是LiveData 不支持分子更改,因此每次更改都可能导致整个列表失效并重新绘制。如果数据有很多变化(如实时应用程序),强烈建议您使用不同的方法。

【讨论】:

  • DiffUtil 在从RecyclerView 添加/更新/删除项目时更多地用于动画目的 - 它们不会提高性能 - 我会说DiffUtil#calculateDif 是一种相当昂贵的方法CPU使用率
  • Google 说这是intended behavior,强烈建议使用 DiffUtil 或自定义 List 实现
  • 确切地说,最简单的方法是使用实​​现 DiffUtills 的 ListAdapter(RecyclerView 不是 ListView 的)。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多