2013-11-15 104 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