Using Espresso to click view inside RecyclerView item

后端 未结 9 1934
醉酒成梦
醉酒成梦 2020-12-02 05:36

How can I use Espresso to click a specific view inside a RecyclerView item? I know I can click the item at position 0 using:

onView(withId(R.i

9条回答
  •  执念已碎
    2020-12-02 06:10

    Try next approach:

        onView(withRecyclerView(R.id.recyclerView)
                        .atPositionOnView(position, R.id.bt_deliver))
                        .perform(click());
    
        public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) {
                return new RecyclerViewMatcher(recyclerViewId);
        }
    
    public class RecyclerViewMatcher {
        final int mRecyclerViewId;
    
        public RecyclerViewMatcher(int recyclerViewId) {
            this.mRecyclerViewId = recyclerViewId;
        }
    
        public Matcher atPosition(final int position) {
            return atPositionOnView(position, -1);
        }
    
        public Matcher atPositionOnView(final int position, final int targetViewId) {
    
            return new TypeSafeMatcher() {
                Resources resources = null;
                View childView;
    
                public void describeTo(Description description) {
                    int id = targetViewId == -1 ? mRecyclerViewId : targetViewId;
                    String idDescription = Integer.toString(id);
                    if (this.resources != null) {
                        try {
                            idDescription = this.resources.getResourceName(id);
                        } catch (Resources.NotFoundException var4) {
                            idDescription = String.format("%s (resource name not found)", id);
                        }
                    }
    
                    description.appendText("with id: " + idDescription);
                }
    
                public boolean matchesSafely(View view) {
    
                    this.resources = view.getResources();
    
                    if (childView == null) {
                        RecyclerView recyclerView =
                                (RecyclerView) view.getRootView().findViewById(mRecyclerViewId);
                        if (recyclerView != null) {
    
                            childView = recyclerView.findViewHolderForAdapterPosition(position).itemView;
                        }
                        else {
                            return false;
                        }
                    }
    
                    if (targetViewId == -1) {
                        return view == childView;
                    } else {
                        View targetView = childView.findViewById(targetViewId);
                        return view == targetView;
                    }
    
                }
            };
        }
    }
    

提交回复
热议问题