【问题标题】:Should Android listView adapter have api callsAndroid listView 适配器是否应该有 api 调用
【发布时间】:2021-01-09 11:18:21
【问题描述】:

您好,我有一个适配器,它显示项目列表以及与setItemsgetCountnotifyDataSetChanged 相关的所有功能。

适配器还可以通过用例调用 api。

结构是

适配器 -> 用例 -> 存储库 -> apiLayer

我知道片段和活动不应包含对 api 的调用(我的实例中的用例)。

所以适配器应该有 api 调用(在我的实例中是用例)

谢谢 回复

【问题讨论】:

  • 这是可能的,但是当配置更改发生(如设备旋转)时,您的 Activity/Fragment 会重新创建(以及适配器)并且您会丢失 UI 状态。您应该考虑拥有一个 ViewModel、拥有 UseCase 等。然后您可以从 Activity/Fragment 观察 ViewModel 的变化并更新适配器。这样配置更改不会导致数据丢失/重新获取数据。
  • 所以在适配器中包含用例并不理想,但它也不是一个坏主意?
  • 如果你能忍受缺点,你绝对可以做到。虽然我不会推荐它。在我看来,让 ViewModel 更新适配器(通过 Activity)是更好的关注点分离。对我来说,适配器只是用来将数据与您的视图连接起来。它不应该再做任何事情。所以这更多的是一个好的设计问题。想想可测试性,你能轻松地对适配器进行单元测试吗?将它放在 viewModel 中会使测试变得更加容易。
  • 是的,我完全同意你的看法。
  • 某种或更好的是,只有 Activity/Fragment 与演示者对话:presenter.fetchData(),然后使用该数据更新适配器。所以适配器除了数据和视图之外什么都不知道。对适配器的依赖较少(知识较少)将使其对更改等更加健壮。

标签: java android kotlin android-adapter android-mvp


【解决方案1】:

这是可能的,但从软件设计的角度来看,我不推荐它。

Adapter 的职责是将您的DataView 连接起来,并将其提供给ListView/RecyclerView。适配器不应该有任何其他依赖(知识)。这也将使其对变化更加稳健。

因此,您应该考虑只有 Activity/Fragment 与您的 Presenter 对话,并将 Presenter 的结果委托给 Adapter。 这也将使(演示者的)(单元)测试更加容易。

class YourActivity: Activity() {
  private val presenter: YourPresenter = // ...

  override fun onCreate() {
    val adapter: YourAdapter = YourAdapter()
    recyclerView.setAdapter(adapter)

    val data = presenter.getData()
    adapter.submit(data)
  }
}

class YourPresenter(private val useCase: UseCase : Presenter() {
  fun getData(): List<Data> {
    return useCase.fetchData()  
  }
}

【讨论】:

    猜你喜欢
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多