【发布时间】:2017-12-17 02:53:56
【问题描述】:
我实际上正在开发一个 Android 应用程序,我应该在其上显示基于 JSON 文档中包含的元数据的动态表单。基本上它的工作方式(没有细节)是一个 JSON 文档代表一个表单的结构:
{
"fields": [
{
"name": "fieldA",
"type": "STRING",
"minCharacters": 10,
"maxCharacters": 100
},
{
"name": "fieldB",
"type": "INTEGER",
"min": 10,
"max": 100
},
{
"name": "fieldC",
"type": "BOOLEAN_CHECKBOX",
"defaultValue": true
}
...
],
"name": "Form A"
}
当应用程序收到其中一个 JSON 文档时,我实际上正在做的是,它遍历每个字段并将其解析到适当的视图(EditText、Checkbox、自定义视图等),向视图添加标签(以便能够轻松检索它)并将视图添加到LinearLayout。这是它实际工作方式的伪代码:
//Add form title
linearLayout.addView(new TextView(form.name));
//Add form fields
for(Field field: form.fields) {
View view;
switch(field.type){
case STRING: view = new EditText();
...
}
view.setTag(field.id);
linearLayout.addView(view);
}
问题在于,对于大型表单(例如 >20 个字段),它需要增加大量视图,并且 UI 线程会受到很大影响。要考虑的另一点是单个屏幕可能有多种形式(一个接一个垂直排序)。
为了避免 UI 线程过载,我想到了 2 个可能的解决方案:
- 使用 RecyclerView。
- 使用Litho by Facebook。
但在考虑这两种解决方案时,我想到了多个问题:
- 使用 Litho 是一个很好的用例吗?还是使用 RecyclerView 就足够了?
- 我的视图状态如何?如果我使用回收模式,我是否能够保持我的每个字段的状态(甚至是那些不在屏幕上的字段),从而能够在不丢失数据的情况下保存表单?
- 如果我使用回收模式来显示一个表单,我将如何处理多个表单?我们可以嵌套 RecyclerView 吗?表单需要像在垂直 RV 内一样依次显示,但如果表单本身是 RV,我应该如何处理?
这更像是一个“良好实践”的问题,并给出了实现我的目标的正确方法或正确方法之一,而不是需要代码示例的具体答案等。
提前感谢您的宝贵时间。
【问题讨论】:
-
如果您担心回收表单视图,请使用
ArrayList和适当的模型类来存储表单数据。为了在单个RecyclerView中显示多个RecyclerViews,请使用NestedScrollView。您可以使用NestedScrollView并在其中添加RecyclerView。其中,在运行时,将填充多个RecyclerViews。我没用过Litho,所以不能说话。如果您需要我发布任何代码或任何内容,也请告诉我。 -
好吧,我真的不明白如果
NestedScrollView没有实现 ViewHolder 模式,它怎么能像RecyclerView一样工作?也许如果你有时间,一些伪代码可以帮助我。 -
好的。给我一些时间。我会用必要的代码 sn-ps 为你编译一个答案。
标签: android forms android-recyclerview litho