1

屏幕上有多個水平Recyclerview。我想在第一個橫向Recyclerview的第一項上執行意式濃縮咖啡單擊事件。請讓我知道我們如何實現它。Espresso AmbiguousViewMatcherException:如何從多個水平Recyclerview中選擇第一個水平Recyclerview

onView(withId(R.id.craousal_recyclerview)) 
.perform(RecyclerViewActions.actionOnItemAtPosition(1, new ClickOnImageView())); 

public class ClickOnImageView implements ViewAction { 
    ViewAction click = click(); 

    @Override 
    public Matcher<View> getConstraints() { 
     return click.getConstraints(); 
    } 

    @Override 
    public String getDescription() { 
     return " click on custom image view"; 
    } 

    @Override 
    public void perform(UiController uiController, View view) { 
     click.perform(uiController, view.findViewById(R.id.craousal_imageview)); 
    } 

它讓我有以下異常:

android.support.test.espresso.AmbiguousViewMatcherException 
+0

您可以發佈您的佈局文件?有可能有一種方法可以在您的應用中執行此操作,而無需通過使用RecyclerViewAction更具體的查看器匹配器來創建自定義ViewActions。 actionOnHolderItem() – jdonmoyer

+0

@jdonmoyer我在我的代碼在運行時創建佈局。通過我得到了解決方案,我提到了答案。但是現在面臨的另一個問題是,我的'RecyclerView'適配器大小變爲零,所以我無法執行列表中的第一項。但在屏幕上,我可以在我的'RecyclerView'中看到數據。它的任何輸入? – chank007

回答

0

花費幾個小時裏,我找到了解決辦法之後,我們需要使用一個匹配器到第一RecyclerView從多個水平RecyclerView匹配。把下面的方法放到你的測試類中。

private <T> Matcher<T> firstView(final Matcher<T> matcher) { 
    return new BaseMatcher<T>() { 
     boolean isFirst = true; 

     @Override 
     public boolean matches(final Object item) { 
      if (isFirst && matcher.matches(item)) { 
       isFirst = false; 
       return true; 
      } 

      return false; 
     } 

     @Override 
     public void describeTo(final Description description) { 
      description.appendText("should return first matching item"); 
     } 
    }; 
} 

這裏是代碼片段,你如何使用它,

onView(firstView(withId(R.id.recyclerview_tray))) 
      .perform(RecyclerViewActions.actionOnItemAtPosition(1, click())); 
相關問題