Android 使用「;findViewById“;重复或商店视图?

Android 使用「;findViewById“;重复或商店视图?,android,findviewbyid,Android,Findviewbyid,作为一个效率怪胎(我相信你们中的很多人也一样),我想知道这一点已经有一段时间了,我只是想提出这个问题: 两种情况,可能两种不同的答案 如果我在一个项目列表中循环,并在线性布局中更新一堆编辑文本,那么这两种方法的优缺点是什么: (一) for(int i=0;i

作为一个效率怪胎(我相信你们中的很多人也一样),我想知道这一点已经有一段时间了,我只是想提出这个问题:

两种情况,可能两种不同的答案

如果我在一个项目列表中循环,并在线性布局中更新一堆编辑文本,那么这两种方法的优缺点是什么: (一)

for(int i=0;i
(二)

TextView电视;
对于(int i=0;i

我认为根本的问题是“findViewById”的效率有多高?这可能很挑剔,我认为2)是更好的解决方案。谢谢

毫无疑问,我认为第二种选择更好。
您不仅可以节省额外一次调用findViewById的成本(如果需要额外一个局部变量,则可以执行此操作)

但是代码的可读性也更高。

毫无疑问,我认为第二个选项更好。
您不仅可以节省额外一次调用findViewById的成本(如果需要额外一个局部变量,则可以执行此操作)

但代码的可读性也要高得多。

这一点也不挑剔。第二种选择无疑是更好的选择

1

for (int i = 0; i < itemList.size(); i++) {
    ((TextView)findViewById(itemList.get(i).getId())).setText(itemList.getText());
    ((TextView)findViewById(itemList.get(i).getId())).setColor(itemList.getColor());
}
for(int i=0;i
看起来很干净,但不是。如果您使用的是同一个textview,绝对不要多次调用findViewById

2

TextView tv;
for (int i = 0; i < itemList.size(); i++) {
    tv = ((TextView)findViewById(itemList.get(i).getId()));
    tv.setText(itemList.getText());
    tv.setColor(itemList.getColor());
}
TextView电视;
对于(int i=0;i
这是更好的选择,因为它只调用findViewById一次。不过,它的可读性稍差一些

<>你也可以考虑第三个选项

for (int i = 0; i < itemList.size(); i++) {
    TextView tv = ((TextView)findViewById(itemList.get(i).getId()));
    tv.setText(itemList.getText());
    tv.setColor(itemList.getColor());
}
for(int i=0;i

这使一切保持在循环中(更容易阅读,imo),而不会显著牺牲效率。我更喜欢第三个,但第二个也是不错的选择。

这一点都不挑剔。第二种选择无疑是更好的选择

1

for (int i = 0; i < itemList.size(); i++) {
    ((TextView)findViewById(itemList.get(i).getId())).setText(itemList.getText());
    ((TextView)findViewById(itemList.get(i).getId())).setColor(itemList.getColor());
}
for(int i=0;i
看起来很干净,但不是。如果您使用的是同一个textview,绝对不要多次调用findViewById

2

TextView tv;
for (int i = 0; i < itemList.size(); i++) {
    tv = ((TextView)findViewById(itemList.get(i).getId()));
    tv.setText(itemList.getText());
    tv.setColor(itemList.getColor());
}
TextView电视;
对于(int i=0;i
这是更好的选择,因为它只调用findViewById一次。不过,它的可读性稍差一些

<>你也可以考虑第三个选项

for (int i = 0; i < itemList.size(); i++) {
    TextView tv = ((TextView)findViewById(itemList.get(i).getId()));
    tv.setText(itemList.getText());
    tv.setColor(itemList.getColor());
}
for(int i=0;i

这使一切保持在循环中(更容易阅读,imo),而不会显著牺牲效率。我更喜欢第三个,但第二个也是一个不错的选择。

一位谷歌员工黛安娜·哈克伯恩(Dianne Hackborn)回答了一个非常类似的问题


她说,只要有可能,你就应该避免重复使用
findviewbyd

谷歌员工黛安娜·哈克伯恩(Dianne Hackborn)回答了一个非常类似的问题


她说,你应该尽可能避免重复使用
findViewByid

如果可能,现在就应该使用new
RecyclerView
。与
LinearLayoutManager
结合使用,您可以实现同样的效果,但必须使用
ViewHolder
模式。
如果使用
列表视图
,还应实现
视图持有者
findViewById
显然效率不高,因此您需要防止对它的调用过多。

如果可能,您现在应该使用new
RecyclerView
。与
LinearLayoutManager
结合使用,您可以实现同样的效果,但必须使用
ViewHolder
模式。
如果使用
列表视图
,还应实现
视图持有者
findViewById
显然效率不高,因此您需要防止对它的调用过多。

第二种方法更好,因为findViewById()的成本在静态UI布局中是可以接受的。但是,由于getView()经常被调用,因此findViewById()的使用应该保持在最小值

第二种方式更好,因为findViewById()的成本在静态UI布局中是可以接受的。但是,由于getView()经常被调用,因此findViewById()的使用应该保持在最小值

使用第二个选项保存: -对findViewById()的调用 -调用itemList.get(i) -对[itemList.get(i)]getId()的调用


另外,请注意,在for循环中,通常向后执行比向前执行快一点(更优化)(因为i0更昂贵)。

使用第二个选项,您可以保存: -对findViewById()的调用 -调用itemList.g