2016-06-22 2 views
2

Приобретая представление в иерархии, у меня есть обе эти функции. Хотя findViewById проще в использовании, я часто видел предложения о том, что это может быть дорогостоящая операция, и ее следует избегать, если это возможно.findViewById vs getChildAt - какой из них быстрее?

Таким образом, если бы все-таки было бы удобно использовать getChildAt? Есть ли какие-либо рекомендации относительно того, когда лучше использовать их?

+0

'' Я часто видел предложения «игнорировать их» – pskink

+0

i guess findViewById() быстрее, просто доступ к конкретным представлениям с идентификаторами. проще реализовать. –

ответ

2

findViewById против getChildAt - какая из них быстрее?

getChildAt действительно быстрее, чем findViewById, так как только доступ к массиву View с при заданном index.

Таким образом, было бы любой быстрее использовать getChildAt вместо

это будет на самом деле, но вы должны знать index из View вы ищете. Если у вас нет механизма отслеживания индекса, вам нужно его искать, и вы вернулись к findViewById. Вероятно, вы, вероятно, закончите писать свою собственную версию findViewById. Мои два цента, не беспокойтесь об этом.

0

Глядя на реализацию ViewGroupfindViewById будет в конечном итоге проходить через детей и сравнивать идентификатор, поэтому я предлагаю просто использовать метод findViewById.

@Override 
protected View findViewTraversal(@IdRes int id) { 
    if (id == mID) { 
     return this; 
    } 

    final View[] where = mChildren; 
    final int len = mChildrenCount; 

    for (int i = 0; i < len; i++) { 
     View v = where[i]; 

     if ((v.mPrivateFlags & PFLAG_IS_ROOT_NAMESPACE) == 0) { 
      v = v.findViewById(id); 

      if (v != null) { 
       return v; 
      } 
     } 
    } 

    return null; 
} 
Смежные вопросы