如何加快循环速度

时间:2014-02-11 10:33:36

标签: android for-loop textview

我根据用户响应动态地将文本视图添加到相对布局,以创建彩色网格图案。通常,这可以包含5000多个文本视图,这些视图具有基于textview标记中的值的不同背景颜色。

我有这种方法,我遍历所有的文本视图,只显示那些具有相同颜色的文本视图,并将其余颜色设置为灰色。当有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 ID的数组。

如果可以做任何事情来加快这一步怎么办?

更新: 我知道拥有那么多小部件并不理想,但我无法想出更好的解决方案。 除了每个网格单元,在这种情况下每个texview,具有不同的颜色,我还需要能够管理单元格的onclick事件,以便我可以添加文本。这就是textviews的原因。在使用textviews之前,我绘制了所有元素,但是当我找不到向每个单元格添加onclick事件的方法时。

我会更好地详细说明这个概念,以帮助你们实现我想要实现的目标,以及我是否走错了路。

这是一个更大的应用程序的一部分,我将图像转换为拼接图表。 基于用户输入,绘制有色单元格的网格,其中每个单元格是从原始图像最主要颜色计算的纯色。 网格将大于屏幕,因此我的视图将放置在水平视图和滚动视图中,以便可以平移和缩放它们。 (这一切都运作良好)。 网格单元必须可单击才能打开或关闭背景颜色,并添加单个文本“X”字符以将针脚(单元格)标记为已完成。(当文本视图(单元格)的数量时,这将减慢是> 500)

希望那里有足够的细节......

3 个答案:

答案 0 :(得分:4)

findViewById()似乎是你的压力点。 我没有保留id的列表,而是保留一份View s本身的引用列表(WeakReference s,如果有可能泄漏的话)!

答案 1 :(得分:1)

1 - for(int i = 0; i&lt; textViewIDs.size(); i ++){... 在开始循环之前,它没有进行优化:在变量中预先计算限制
int len = textViewIDs.size(); 并在您的周期中使用len。

2 - i - (我称之为“反向循环”)似乎比i ++更快。查看一个不错的循环比较here

答案 2 :(得分:0)

让许多TextView的低端设备无法加载它是一种不好的做法。

尝试在其中制作一个包含多个样式的TextView,您可以将HTML标记用于背景颜色。

或者更好的是只创建一个ListView,这将为您回收视图。