我根据用户响应动态地将文本视图添加到相对布局,以创建彩色网格图案。通常,这可以包含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)
希望那里有足够的细节......
答案 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
,这将为您回收视图。