2016-06-22 1 views
2

Acquérir une vue dans la hiérarchie J'ai ces deux fonctions disponibles. Alors que findViewById est plus facile à utiliser, j'ai souvent vu des suggestions que cela peut être une opération coûteuse et devrait être évitée si possible.findViewById vs getChildAt - lequel est le plus rapide?

Par conséquent, en serait-il plus rapide d'utiliser getChildAt à la place? Y a-t-il des directives quant à quand il est préférable d'utiliser lequel?

+0

' « J'ai vu souvent des suggestions »' les ignorer – pskink

+0

je suppose findViewById() est plus rapide, juste accéder aux vues particulières avec ID de. plus facile à mettre en œuvre. –

Répondre

2

findViewById vs getChildAt - dont l'un est plus rapide?

getChildAt est en effet plus rapide que findViewById, car il est juste en train d'accéder un tableau de View s au index spécifié.

Par conséquent, en serait-il plus rapide d'utiliser à la place getChildAt

il sera en effet, mais vous devez connaître le index du View que vous recherchez. Si vous n'avez aucun mécanisme pour suivre l'index, vous devez le rechercher, et vous êtes revenu à findViewById. Vous aurez probablement fini par réécrire votre propre version de findViewById. Mes deux cents, ne vous inquiétez pas à ce sujet.

0

En regardant ViewGroup mise en œuvre findViewById finira par passer par les enfants et comparer id donc je suggère d'utiliser simplement la méthode 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; 
}