2017-08-08 4 views
0

enter image description hereEspresso - comment accéder Pour le RecyclerView donné des éléments enfants de ViewHolder

, je peux accéder à l'élément LinearLayout par:

recyclerView.findViewHolderForAdapterPosition(1) 

où 1 est le 2ème élément/position dans RecyclerView et la ViewHolder est retourné.

Comment puis-je accéder aux éléments enfants du ViewHolder LinearLayout? Ou existe-t-il un moyen d'accéder à l'élément AppCompatTextView afin de pouvoir extraire le texte de cet élément?

Répondre

0

J'ai créé la classe RecyclerViewMatcher puis le code suivant

onView(withRecyclerView(R.id.rv_fragment_recipes).atPosition(0)) 
 
       .check(matches(isDisplayed())); 
 

 
     onView(withRecyclerView(R.id.rv_fragment_recipes).atPositionOnView(0, R.id.tv_recipe_name)) 
 
       .check(matches(isDisplayed())) 
 
       .check(matches(withText("Nutella Pie"))); 
 

 
     onView(withRecyclerView(R.id.rv_fragment_recipes).atPositionOnView(0, R.id.tv_servings)) 
 
       .check(matches(isDisplayed())) 
 
       .check(matches(withText("Servings : 8"))); 
 

 
     onView(withRecyclerView(R.id.rv_fragment_recipes).atPosition(0)) 
 
       .perform(click());

public class RecyclerViewMatcher { 
 
    private final int recyclerViewId; 
 

 
    public RecyclerViewMatcher(int recyclerViewId) { 
 
     this.recyclerViewId = recyclerViewId; 
 
    } 
 

 
    public Matcher<View> atPosition(final int position) { 
 
     return atPositionOnView(position, -1); 
 
    } 
 

 
    public Matcher<View> atPositionOnView(final int position, final int targetViewId) { 
 

 
     return new TypeSafeMatcher<View>() { 
 
      Resources resources = null; 
 
      View childView; 
 

 
      public void describeTo(Description description) { 
 
       String idDescription = Integer.toString(recyclerViewId); 
 
       if (this.resources != null) { 
 
        try { 
 
         idDescription = this.resources.getResourceName(recyclerViewId); 
 
        } catch (Resources.NotFoundException var4) { 
 
         idDescription = String.format("%s (resource name not found)", 
 
           new Object[] { Integer.valueOf 
 
             (recyclerViewId) }); 
 
        } 
 
       } 
 

 
       description.appendText("with id: " + idDescription); 
 
      } 
 

 
      public boolean matchesSafely(View view) { 
 

 
       this.resources = view.getResources(); 
 

 
       if (childView == null) { 
 
        RecyclerView recyclerView = 
 
          (RecyclerView) view.getRootView().findViewById(recyclerViewId); 
 
        if (recyclerView != null && recyclerView.getId() == recyclerViewId) { 
 
         childView = recyclerView.findViewHolderForAdapterPosition(position).itemView; 
 
        } 
 
        else { 
 
         return false; 
 
        } 
 
       } 
 

 
       if (targetViewId == -1) { 
 
        return view == childView; 
 
       } else { 
 
        View targetView = childView.findViewById(targetViewId); 
 
        return view == targetView; 
 
       } 
 

 
      } 
 
     }; 
 
    } 
 
}

for refernce you can follow this project

utilisation IdelingResource si les données ne sont pas statiques recyclerView

+0

Ouais, je l'ai vu ce code. Cela vous amènera à l'élément ViewHolder comme décrit dans ma question, mais existe-t-il un moyen d'obtenir les éléments enfants de cela, pour accéder directement à l'élément de texte affiché? Ce code ne le fait pas actuellement. – rfodge