2017-04-10 2 views
0

J'ai une vue de liste, contenant plusieurs lignes avec le même Id; chaque rangée a plusieurs composants différents. Voici un extrait de la hiérarchie (toutes avec visibilité = VISIBLE):Comment obtenir les détails d'un certain élément de liste?

->ListView{id=213, res-name=listview, child-count=2} 
-->RelativeLayout{id=214, res-name=bground, child-count=5} 
--->AppCompatTextView{id=215, res-name=name, text=Short} 
--->AppCompatTextView{id=216, res-name=valid, text=10.04.} 
--->... further elements in the RelativeLayout res-name=bground 
-->RelativeLayout{id=214, res-name=bground, child-count=5} 
--->AppCompatTextView{id=215, res-name=name, text=Group} 
--->AppCompatTextView{id=216, res-name=valid, text=09.04} 
--->... 

Je veux faire une boucle sur tous les premiers éléments de niveau dans cette liste (tous les éléments de RelativeLayout avec res-name = bground) et vérifiez l'attribut name; Une fois que j'ai trouvé l'élément que je recherche (par exemple, name = Group), je veux vérifier ses autres attributs.

Mon codage actuel:

for (int i = 0; i < numItems; i++) { 
    String type = getDataText(allOf(withId(R.id.name), 
     childAtPosition(
      allOf(withId(R.id.bground), 
       childAtPosition(withId(R.id.listview),i)), 
      0), 
     isDisplayed())); 

où getDataText est:

String getDataText(final Matcher<View> matcher) { 
    final String[] stringHolder = { null }; 
    onData(matcher).perform(new ViewAction() { 
     @Override 
     public Matcher<View> getConstraints() { 
      return isAssignableFrom(TextView.class); 
     } 

     @Override 
     public String getDescription() { 
      return "getting text from a TextView"; 
     } 

     @Override 
     public void perform(UiController uiController, View view) { 
      TextView tv = (TextView)view; 
      stringHolder[0] = tv.getText().toString(); 
     } 
    }); 
    return stringHolder[0]; 
} 

Dans l'exécution de la boucle représentée ci-dessus, je reçois un AmbiguousViewMatcherException, où listview est marqué comme problème. Je suppose que cela signifie qu'Espresso a trouvé des enfants ambigus dans l'élément listview (ce qui est vrai), mais childAtPosition ne devrait prendre que l'élément spécifié par l'index de position.

Comment puis-je implémenter la boucle correctement?

Merci et meilleures salutations Gerhard

Répondre

0

Vous pouvez ajouter isDisplayed() à votre matcher adapterview d'interagir avec le ListView actuellement visible.

inAdapterView (allof (withId (android.R.id.list), isDisplayed()))

+0

Merci pour votre réponse. Malheureusement, je n'ai pas réussi à le faire fonctionner. – Gerhard

+0

En attendant, j'ai trouvé ceci: L'application montre trois onglets (le premier est visible sur l'écran), tous les trois ont l'attribut visible = VISIBLE dans la hiérarchie de la vue. Et vraiment le premier et aussi le troisième onglet contiennent un élément listview. Je m'y attendais ce qui devrait résoudre: '... allof (childAtPosition ( allof (childAtPosition ( childAtPosition ( withId (R.id.pager), 1), 0), isDisplayed()), 0)/* = listview * /, isDisplayed()), ... Pouvez-vous expliquer à nouveau votre solution? Merci et meilleures salutations Gerhard – Gerhard