2014-02-11 100 views
0

我動態地將textviews添加到基於用戶響應的相對佈局以創建彩色網格圖案。通常情況下,這可以包含5000多個textview,它們根據textview標記中的值具有不同的背景顏色。如何加速循環

我有這種方法,我遍歷所有textviews,只顯示那些具有相同的顏色,並將其餘設置爲灰色。如果有500條文字瀏覽,但是數字較高時表示5000,則需要13秒才能完成。

if (code.equals("all")) { 
    for (int i = 0; i < textViewIDs.size(); i++) { 
     TextView tv = (TextView) findViewById(textViewIDs.get(i)); 
     if (!tv.getTag().toString().equals("header")) { 
      tv.setBackgroundColor(Color.parseColor("#" + tv.getTag().toString())); 
     } 
    } 
} else { 
    for (int i = 0; i < textViewIDs.size(); i++) { 
     TextView tv = (TextView) findViewById(textViewIDs.get(i)); 
     if (!tv.getTag().equals(code)) { 
      if (!tv.getTag().toString().equals("header")) { 
       tv.setBackgroundColor(Color.LTGRAY); 
      } 
     }else{ 
      tv.setBackgroundColor(Color.parseColor("#" + tv.getTag().toString())); 
     } 
    } 
} 

textViewIDs是包含所有textview標識的數組。

如果能做些什麼來加快速度呢?

更新: 據我所知,擁有這些小部件並不理想,但我無法想出更好的解決方案。 以及每個網格單元格,在這種情況下,每個texview,具有不同的顏色,我也需要能夠管理單元格的onclick事件,以便我可以添加文本。這是文字瀏覽的推理。在使用textviews之前,我繪製了所有元素,但是當我找不到將onclick事件添加到每個單元格的方法時。

我最好詳細說明這個概念,以幫助我們試圖實現的目標,以及如果我走錯了路。

這是一個更大的應用程序的一部分,我將圖像轉換爲針跡圖。 基於用戶輸入,繪製彩色單元網格,其中每個單元格是從原始圖像最主要顏色計算出的純色。 網格將比屏幕大,所以我的視圖放置在水平和滾動視圖中,以便它們可以平移和縮放。 (這一切都很好)。 網格單元格必須可點擊才能打開或關閉背景顏色,並添加單個文本「X」字符以將針跡(單元格)標記爲已完成(這會減慢文本視圖(單元格)爲> 500)

希望有足夠的細節還有...

+2

數組沒有得到方法。 – Blackbelt

+0

以及它不是陣列,它的數組列表......但我不認爲你實際上可以加速循環...但是數組如果排序的話會更快,但是這要幫助你很多:) –

+2

或者試着使用ListView –

回答

4

findViewById()似乎是你的壓力點。 而不是保留一個ID列表,我會保留一個引用清單View s本身(WeakReference s如果泄漏是可能的)!

+0

謝謝,那是什麼樣的列表?數組列表? – Mark

+0

ArrayList肯定會完成這項工作! – nyx

+0

用你的想法(nyx)更新代碼後,而不是13秒,現在是即時的。誰認爲會產生這樣的差異。我還納入了Artoo預先計算循環限制的想法。謝謝你們 – Mark

0

讓很多TextView的低端設備無法加載它是一種不好的做法。

嘗試製作一個TextView其中有多種樣式,您可以使用HTML標籤作爲背景顏色。

或者更好的是創建一個ListView,這將爲您回收視圖。

1

1 - 爲(INT I = 0;我< textViewIDs.size();我++){... 它不是最優化:預先計算的極限在可變啓動循環前:
INT LEN = textViewIDs.size();並在你的週期中使用len。

2 - i--(我稱之爲「反向循環」)似乎比i ++更快。看到一個很好的循環比較here

+0

這很合理,它減少了2秒到11秒。 – Mark

+0

更多的物品,更多的速度增加,當然。這是大量的。 –