问题描述
||
我正在尝试构建一个复杂的表单,其中几乎所有元素都是可选的。它仅从单个字段和一个“添加元素”按钮开始。当您单击添加时,表单显示可以添加到表单的元素类型的“ 0”(位置,照片,详细注释,“ \ now \”以外的时间戳等)。选择一个项目时,它将启动一个
Activity
,并且每个项目都有一个不同的关联associated1ѭ。
另外,每个选择都将具有几位数据,最好以某种方式将“ 1”存储为“ with”:
icon0中的图标和显示名称
用于在db中存储数据的密钥(以及传递给Web服务的密钥)
用于在原始表单上显示结果的布局(即照片的缩略图,位置的经/纬度等)
我正在考虑一组类,这些类都扩展了一个抽象的FormElement
类,并且对于上述每个额外的数据片段都具有静态元素。 (此解决方案的另一个缺点是静态情况下痛苦6英镑有多大。)
如何使它尽可能清洁和可维护?我真的不喜欢编辑五个不同的文件来向此表单添加新类型的元素。 (主要是因为我可以保证我会错过一个,并花费数小时来追踪错误。)
解决方法
一些提示...
单元测试将防止\“ unbugs \” :)
当每个“ 1”从用户那里获取所需的信息时,请使用包含每个类型数据的“ 8”来调用Activity#setResult()。
Intent
支持所有Bundle
方法,因此您可以根据需要设置不同类型的数据。
要支持#2,请确保您使用的是Activity#startActivityForResult(Intent,int)
来启动它,并在Activity#onActivityResult(int,Intent)
中收听结果
我可能会维护与SpinnerAdapter
(例如\14ѭ)一起使用的可用\“ element \”类型的列表,并在Adapter \ '17ѭ方法中调用诸如ѭ15static,.getActivityClass()
等静态方法,以确定要处理的内容显示以及要启动的活动。
这样,您的列表实际上将包含诸如{ MyPhotoElement.class,MyTextElement.class,MyDateElement.class,...}
)。
将每个元素添加到表单后,将其添加到ArrayList<AbstractFormElement>
中,它将用于支持另一个适配器以ListView
。该适配器将根据其对象的类型调度自定义视图布局的膨胀,并创建ViewHolder,这将要求每个不同的AbstractFormElement
都具有自己的“视图类型”。适配器。请参见BaseAdapter#getItemViewType(int)和相关的getViewTypeCount()
。
值得注意的是,只有当一个不能转换为另一种时,这些视图才需要不同的视图类型。例如,如果您有两个\“ Elements \”只需要在列表中显示文本字符串,它们都可以共享一个“纯文本”视图类型。同样,仅显示照片的两个元素,或可以轻松地将它们彼此转换的元素(例如,带有标题的图标与不带标题的照片缩略图)可以共享一个“图像加标题”视图类型。
考虑到上述情况,您实际上最终将不得不修改不同的文件以添加新的类型(嗯,从技术上讲,您可以将它们全部作为一个内部类存储在一个文件中,但是实际上并没有很好的论点这样做),但是如果您正确地完成了接口API并遵循良好的OO实践并实施了良好的单元测试,则将大大减少查找错误所需的工作量-仅仅是因为大多数事情如果执行不正确,则涉及添加新类型实际上会导致编译器错误。除此之外,一个适当的单元测试套件将能够以编程方式添加所有可能的类型,并确保所有内容都能正确显示,并且您应该拥有一个相当简化的过程以易于扩展:)
这听起来像是很多工作,一开始看起来似乎很乏味和冗长。但是最终结果实际上更易于维护,尤其是在元素类型列表相当广泛的情况下。