Android最佳实践:包结构问题

8

基于以下资料:

我已经创建了以下Android包结构:

  • com.company.product.activities

  • com.company.product.database

  • com.company.product.fragments

  • com.company.product.fragments.adapters

  • com.company.product.models

但有时,根据需求,我需要为自定义对话框编写适配器。

应该将它放在哪里呢?因为这是一个小的适配器,大多在活动中的对话框中使用,并且操作会反映回活动中。

面临的问题是:

  1. 太多上下文(活动)引用传递到适配器中。

  2. 所有方法都变成public,这违反了面向对象编程的隐藏实现细节的概念。

  3. 在包装结构中拥有一个私有适配器会带来多大的差异?这是Android项目包结构的标准方法吗?

1个回答

7
我会将适配器放置在adapters包中。即使是小适配器,大多数情况下都将在对话框中的活动中使用,并反映回活动的操作,您永远不会知道适配器将如何发展以及它将在什么情况下被使用。
关于您的担忧:
  1. 上下文引用过多 - 每个适配器实例将有一个单独的Context引用。只要您没有从适配器中泄漏任何内容,那么这不是问题。您可能还将此适配器扩展为其他实现,这也将适用于这些实现。
  2. 所有方法最终都是公共的,这违反了面向对象编程隐藏实现细节的概念。只要您从应用程序中调用适配器(这应该始终是情况),并且您没有构建SDK,我真的看不出问题所在。如果您担心面向对象编程的最佳实践,我宁愿担心使适配器遵守单一职责原则:不要让适配器做更多的事情,仅显示给定数据
  3. 考虑到可重用性,我宁愿不将适配器作为私有(静态或非静态)类成员。此外,最佳实践建议在处理从内部类调用private代码时不使用private访问。
因此,总结考虑到可重用性、单一职责和最佳实践文章,我赞成将适配器分离为专用类。

好的,我明白你的意思,但是在适配器中每个项目视图(例如ImageView)点击需要关闭相应的对话框或类似的内容,现在需要在哪里处理这个问题以关闭对话框? - Akhil Jain
对于这种情况,我会遵循“Fragments”中描述的模式:在适配器中定义一个静态接口,负责显示/关闭对话框,并且实现本身(DialogFragment的实际显示和关闭)可以在父活动或片段中实现。您可以传递该对象的实例,或者在适配器构造函数上强制进行类转换。这符合我上述的三个声明。 - gunar
谢谢确认,我想这么做,但不确定。 - Akhil Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接