代码之家  ›  专栏  ›  技术社区  ›  Uriel Frankel

Android Espresso:在每个选项卡中使用RecyclerViews滑动选项卡

  •  4
  • Uriel Frankel  · 技术社区  · 10 年前

    我有一个滑动标签应用程序,每个标签都有回收视图。 我正在使用测试应用程序 Android Espresso 。我想单击其中一个回收视图项目。当我这样做时:

     onView(withId(R.id.recyclerView))
                .perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
    

    我得到这个例外:

    android.support.test.espresso.AmbiguousViewMatcherException: 'with id: com.uriel.frankel:id/recyclerView' matches multiple views in the hierarchy.
    

    有什么想法吗?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Drilon Blakqori    10 年前

    嗯,我想您对每个 RecyclerView 在您的选项卡中。因此 RecyclerView's 有相同的ID,所以你不能参考你的 RecyclerView的 使用您的ID。

    所以要么给每一个 回收站视图 它自己的ID或尝试与任何其他ID一起搜索 ViewMatcher 喜欢 withText("any specific text in your recyclers") . Here 你可能会找到适合你的方法。

        2
  •  0
  •   denys    10 年前

    我建议创建 ViewHolder 匹配器,用于匹配内部的特定项目 RecyclerView 。然后您就可以使用 PositionableRecyclerViewAction 喜欢 scrollToHolder(...) 例如:

    public static Matcher<RecyclerView.ViewHolder> withMessageSubjectInViewHolder(String itemSubject) {
            Checks.checkNotNull(itemSubject);
            return new BoundedMatcher<RecyclerView.ViewHolder,
                    MyRecyclerViewItemAdapter.MyViewHolder>(MyRecyclerViewItemAdapter.MyViewHolder.class) {
                @Override
                public boolean matchesSafely(MyRecyclerViewItemAdapter.MyViewHolder holder) {
                    boolean isMatches = false;
    
                    if (!(holder.subject == null)) {
                        isMatches = ((itemSubject.equals(holder.subject.getText().toString()))
                                && (holder.subject.getVisibility() == View.VISIBLE));
                    }
                    return isMatches;
                }
    
                @Override
                public void describeTo(Description description) {
                    description.appendText("with message subject: " + itemSubject);
                }
            };
        }
    

    这就是我使用它的方式:

    onView(withId(R.id.my_recycler_view_id)).perform(scrollToHolder(withMessageSubjectInViewHolder(unique_message_subject)));
    onView(withText(unique_message_subject)).check(matches(isDisplayed())).perform(click());