Android Robolectric点击RecyclerView项目

有没有办法模拟使用Robolectric点击RecyclerView项目?

到目前为止,我已尝试在RecyclerView的第一个可见位置获取View ,但这始终为null 。 它的getChildCount()保持返回0 ,并且findViewHolderForPosition始终为null 。 适配器从getItemCount()返回一个非0数字getItemCount()适配器中肯定有项目)。

我正在使用Robolectric 2.4 SNAPSHOT。

Solutions Collecting From Web of "Android Robolectric点击RecyclerView项目"

似乎问题是需要在Robolectric中手动测量和布置RecyclerView。 调用此方法可以解决问题:

 recyclerView.measure(0, 0); recyclerView.layout(0, 0, 100, 10000); 

使用Robolectric 3,您可以使用visible():

 ActivityController activityController = Robolectric.buildActivity(MyActivityclass); activityController.create().start().visible(); ShadowActivity myActivityShadow = shadowOf(activityController.get()); RecyclerView currentRecyclerView = ((RecyclerView) myActivityShadow.findViewById(R.id.myrecyclerid)); currentRecyclerView.getChildAt(0).performClick(); 

这消除了手动触发视图测量的需要。

扩展Marco Hertwig的答案:

您需要将recyclerView添加到活动中,以便按预期调用其布局方法。 你可以手动调用它们(就像在Elizer的回答中一样),但你必须自己管理状态。 此外,这不会模拟实际的用例。

码:

 @Before public void setup() { ActivityController activityController = Robolectric.buildActivity(Activity.class); // setup a default Activity Activity activity = activityController.get(); /* Setup the recyclerView (create it, add the adapter, add a LayoutManager, etc.) ... */ // set the recyclerView object as the only view in the activity activity.setContentView(recyclerView); // start the activity activityController.create().start().visible(); } 

现在,您无需担心每次更新recyclerView调用layoutmeasure (例如,通过添加/删除adapter项目)。