【问题标题】:MutableLiveData<ArrayList<T>> vs MutableLiveData<List<T>>. Why should we use List here?MutableLiveData<ArrayList<T>> 与 MutableLiveData<List<T>>。为什么我们要在这里使用 List?
【发布时间】:2021-09-03 06:56:09
【问题描述】:

我在这里创建了一个库:https://github.com/chanjungkim/ALiveData

这个库是因为MutableLiveData&lt;ArrayList&lt;T&gt;&gt;而制作的。许多了解 LiveData 的人在需要操作(添加、删除等)MutableLiveData 时抱怨或对这种类型感到困惑。那是因为 ArrayList 易于操作,_arrayList.value!!.add(item)_arrayList.value!!.remove(0) 似乎可以通知。但他们没有。

最后,当我们要通知时,我们必须分配一个像_arrayList.value!! = mList 这样的值。 ArrayList和List都需要设置_arrayList.value!! = mArrayList或者_arrayList.value!! = mList这样的数据。

我的问题是 List 没有 add()、remove() 等。另一方面,ArrayList 已经有了这些功能,可以帮助我们更轻松地操作列表。

有人这样建议

_list.value = list.value.toMutableList().doWhatever().toList()

那么,使用 List 而不是 ArrayList 有什么意义呢?能否举例说明使用方法?

【问题讨论】:

  • 如果您希望它始终是可变的,为什么不简单地使用MutableLiveData&lt;MutableList&lt;T&gt;&gt;?关键在于意图,并且与实施无关。如果您有List&lt;T&gt;,您可以使用AwesomeList。当您拥有ArrayList 时,您只能使用 ArrayList。
  • 最后,您应该有一个“隐藏的”MutableLiveData 和一个“公开的”LiveData,其中包含返回可变版本的自定义 getter。所以你不能从消费者方面把东西放在那里。因此,暴露的LiveData&lt;List&lt;T&gt;&gt; 可以与隐藏的MutableLiveData&lt;MutableList&lt;T&gt;&gt; 一起使用。

标签: android list arraylist android-livedata mutablelivedata


【解决方案1】:

List 是一个接口,它定义了任何想要表现得像一个列表的类必须实现的方法。它可以被认为是列表的“最基本”版本,并且只定义了实现类的最低要求,使其表现得像一个列表。

同样,List 接口本身扩展了Collections 接口,后者又扩展了Iterable 接口。每一个都为前一个增加了更多功能……有点像乐高积木堆叠在一起,创造出更复杂的形状。

ArrayList 是一个类,它实现了MutableList(它本身实现了List)。这意味着ArrayList 可以被实例化,并作为实际对象传递。由于这种面向对象的设计,并且根据Liskov substitution principle,任何类(或接口)都可以替换为子类(或实现接口的类)。

这是面向对象设计的基本原则。它有助于将应用程序的各个部分分解为更小、更基本且更易于管理的部分,然后根据需要进行扩展。

为了更具体地回答您的问题,如果观察 LiveData 的类只关心 List 接口中定义的方法,那么这就是它所需要了解的所有值。实际值实际上可以是ArrayListMutableList 甚至是自定义的class MyOwnFancyList&lt;E&gt;: List&lt;E&gt;,对观察者来说并不重要,只要它实现了List 接口即可。

【讨论】:

  • 好吧,这不是我的答案。我的问题不是关于 List 有多灵活,而是我们为什么要在 LiveData 中使用它。没有理由使用 List 接口的自定义子类。
  • 嗨@c-an,重新阅读您的问题后,我想我更了解您的问题。我已经写了第二个答案 - 如果这更符合您的要求,请告诉我。
【解决方案2】:

LiveData 可以有不同的使用方式,当然没有一种正确的方式,但一种非常常见的使用方式是在 Android MVVM architecture recommended by Google 中用于 Android 应用程序。

在此架构中,Activity(或 Fragment)观察 ViewModel 的 LiveData。这样做时,目标是让 UI 尽可能“笨拙”,您尝试在 ViewModel 中处理尽可能多的应用程序逻辑和行为,而 Activity 只是观察并反映在 UI 上。

在这种情况下,观察到的LiveData 的值通常是不可变的。

通过这样做,它限制了 Activity 能够操纵它正在观察的数据,例如 add()ing 或 remove()ing 来自它的任何内容。如前所述,目标应该是限制 UI 进行这些类型更改的能力。 如果 Activity 想要将 add() 项目更改为 ArrayList它正在观察,它应该通过调用 ViewModel 上的一个方法来执行此操作,该方法反过来将它自己的 LiveData.value 更新为新的更新列表,该列表又将由 Activity 观察并在 UI 上更新。

通过只允许 Activity 观察不可变的值,它有助于强制执行这种关注点分离,并限制任何意外“泄漏”到 Activity 本身的逻辑。

通过确保观察值的类型为LiveData 而不是MutableLiveData,可以进一步扩展这个想法。使用后者可以让 Activity 自行操作实时数据,并打破 MVVM 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多