2013-11-15 103 views
1

我需要创建动态布局(即根本不使用xml)。在移动设备上,服务api将提供jsons。这些jsons将保持布局模式或设计动态绘制。 这些布局jsons将corespond我们需要显示不同的模板。它可以超过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个项目。我正在使用这个库在一个时间点加载n个物品,共计x个物品--- https://github.com/chrisbanes/Android-PullToRefresh

现在的问题是: -

  • 内存泄漏,因为我们没有使用视图持有人格局。

  • 上下文用于创建它们与活动 生命周期耦合的新视图。

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

请为我提供一个使用除Listview以外的替代解决方案或修改当前的方法。

+0

查看持有者模式用于通过减少对findviewbyid的调用来减少充值列表项所需的时间,这是一项昂贵的操作。它不用于内存管理目的。ListView生成的元素只有在您滚动时才会显示更多视图。所以内存管理所需要的是别的地方。请在应用程序崩溃时发布日志猫 –

+0

我的公司政策也经常禁止我发布代码。最好写一个单独的(非常简单的)例子来展示你的问题并发布。当你发布你的“蒸馏”例子时,确保你告诉人们你正在做的是为了防止“你为什么这样做?”的不可避免的潮流。的问题。 – Martin

+0

我会在星期一发布一个示例代码。 –

回答

0

对您而言最重要的是务必执行Adapter.getItemViewType。每个布局应该有它自己的类型标识符。您的convertView参数(如果已设置)将始终具有正确的布局已经充满。

现在,您可以再次使用固定器模式,对每种布局使用不同的固定器。

编辑:我不认为你的情况很适合ListView。 ListView意味着通常包含类似内容的大型列表。您是否考虑过在ScrollView中使用垂直方向的LinearLayout?

如果你的布局都是不同的,你之间的适配器动态生成它们,这将是缓慢的(你已经在使用ListView的方法),或产生一次全部,这可能采取更多的决定记忆。

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

+0

此解决方案是您事先知道不同充气机布局的数量。在我的情况下,他们是动态的,他们可以是15或150 –

+0

任何人都可以发表一些回应?这是一个相当不错的问题 –

+0

@RahulGupta你解决了这个问题吗? – dipali