2014-02-11 53 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

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