我需要创建动态布局(即根本不使用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之外的其他解决方案或修改当前方法。
答案 0 :(得分:0)
最重要的是确保实施Adapter.getItemViewType。每个布局都应该有自己的类型标识符。您的convertView参数(如果已设置)将始终具有已充气的正确布局。
现在,您可以再次使用支架图案,为每个布局使用不同的支架。
编辑:我认为您的情况不适合ListView。 ListView适用于类似内容的大型列表。您是否考虑过在ScrollView中使用垂直方向的LinearLayout?
如果你的布局都不同,你必须决定在适配器中动态生成它们(你已经使用的ListView方法),这将很慢,或者一次性生成它们,可能> em>需要更多记忆。
至于你的具体问题: *不使用Holder模式不会引入内存泄漏。你可能误解了Holder模式的目的。它只是为了减少类似布局的再次膨胀。 *即使在适配器中创建了视图,它们仍然可以使用您的活动的上下文创建。它们是UI元素,因此将始终绑定到Activity生命周期。