动态视图创建性能问题

时间:2013-11-15 12:00:08

标签: android json templates listview dynamic

我需要创建动态布局(即根本不使用xml)。在移动设备上,服务api将提供jsons。这些jsons将保持布局模式或设计以动态绘制。 这些布局jsons将适应我们需要显示的不同模板。它可以超过150个模板。 请在下面找到示例模板: -

Template.json

{
"data": {
    "layouts": [
        {
            "layoutId": 0,
            "width": "34%",
            "selectedbackgroundcolor": "#96F2CD",
            "gradient": true,
            "backgroundcolor": "#afeeb9",
            "gradientcolors": [
                "#afeeb9",
                "#f3f6f7"
            ],
            "strokewidth": 1,
            "strokecolor": "#7bad51",
            "children": [
                {
                    "children": [
                        {
                            "backgroundcolor": "#3074c6",
                            "type": "label",
                            "field": "textfield1",
                            "fontsize": 14,
                            "textcolor": "#FFFFFF",
                            "alignment": "right",
                            "width": 242,
                            "singleline": true,
                            "topmargin": 10,
                            "rightmargin": 10,
                            "rightpadding": 10,
                            "bottompadding": 5,
                            "toppadding": 5
                        },
                        {
                            "backgroundcolor": "#3074c6",
                            "type": "label",
                            "text": "textfield: #",
                            "dependonfield": "textfield1",
                            "fontsize": 14,
                            "topmargin": 10,
                            "textcolor": "#FFFFFF",
                            "alignment": "right",
                            "width": 95,
                            "singleline": true,
                            "leftpadding": 10,
                            "bottompadding": 5,
                            "toppadding": 5,
                            "leftmargin": 10
                        }
                    ]
                },
                {
                    "children": [
                        {
                            "type": "label",
                            "field": "FormattedClosedDate",
                            "fontsize": 14,
                            "textcolor": "#000000",
                            "alignment": "right",
                            "width": 90,
                            "topmargin": 5,
                            "singleline": true,
                            "rightmargin": 10
                        },
                        {
                            "type": "label",
                            "text": "Closed On: ",
                            "dependonfield": "FormattedClosedDate",
                            "fontsize": 14,
                            "topmargin": 5,
                            "textcolor": "#000000",
                            "alignment": "right",
                            "width": 100,
                            "singleline": true,
                            "leftmargin": 5,
                            "bold": true
                        }
                    ]
                },
                {
                    "children": [
                        {
                            "type": "label",
                            "field": "Title",
                            "textcolor": "#000000",
                            "alignment": "left",
                            "fontsize": 17,
                            "bold": true,
                            "singleline": true,
                            "topmargin": 10,
                            "leftmargin": 10,
                            "rightmargin": 10
                        }
                    ]
                },
                {
                    "children": [
                        {
                            "type": "label",
                            "field": "Summary",
                            "textcolor": "#7E957B",
                            "alignment": "left",
                            "fontsize": 14,
                            "leftmargin": 10,
                            "bottompadding": 20,
                            "maxline": 2,
                            "rightmargin": 10
                        }
                    ]
                }
            ]
        }
    ]
},
"rcode": 100,
"msg": "Success"
}

我为这些模板编写了布局解析器。我选择Listview来动态膨胀从布局解析返回的视图。每个listview的行现在都包含不同的布局视图或模板。 所以我不能使用视图持有者模式来重用视图的元素。视图是动态创建的,因此视图ID是动态创建的。

我在单个时间点显示列表中的15个项目。我正在使用这个库在单个时间点https://github.com/chrisbanes/Android-PullToRefresh加载n个项目,形成总x个项目。

现在的问题是: -

  • 内存泄漏,因为我们没有使用视图持有者模式。

  • Context用于创建从活动中耦合的新视图 生命周期。

  • 在活动未被销毁之前,视图不会被销毁。

请向我提供使用Listview之外的其他解决方案或修改当前方法。

1 个答案:

答案 0 :(得分:0)

最重要的是确保实施Adapter.getItemViewType。每个布局都应该有自己的类型标识符。您的convertView参数(如果已设置)将始终具有已充气的正确布局。

现在,您可以再次使用支架图案,为每个布局使用不同的支架。

编辑:我认为您的情况不适合ListView。 ListView适用于类似内容的大型列表。您是否考虑过在ScrollView中使用垂直方向的LinearLayout?

如果你的布局都不同,你必须决定在适配器中动态生成它们(你已经使用的ListView方法),这将很慢,或者一次性生成它们,可能 em>需要更多记忆。

至于你的具体问题:  *不使用Holder模式不会引入内存泄漏。你可能误解了Holder模式的目的。它只是为了减少类似布局的再次膨胀。  *即使在适配器中创建了视图,它们仍然可以使用您的活动的上下文创建。它们是UI元素,因此将始终绑定到Activity生命周期。