有没有办法在Robolectric中模拟对RecyclerView项目的点击?目前,我尝试获取RecyclerView中第一个可见位置的View,但始终为null。它的getChildCount()一直返回0,并且findViewHolderForPosition始终为null。适配器从getItemCount()返回非零数字(适配器中肯定有项目)。我正在使用Robolectric 2.4 SNAPSHOT。
看起来问题是在Robolectric中需要手动测量和布局RecyclerView
。调用此方法解决了问题:
recyclerView.measure(0, 0);
recyclerView.layout(0, 0, 100, 10000);
使用 Robolectric 3,您可以使用 visible():
ActivityController<MyActivity> 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<Activity> 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();
}
只需调用即可。
Robolectric.flushForegroundThreadScheduler()
在执行performClick()之前,确保所有UI操作(包括使用数据集填充后的Recycler View的测量和布局阶段)都已完成。
findViewById
之后做,但通常会在我需要它之前立即做。 - EliezernotifyDatasetChanged()
或类似方法的次数相同,而不仅仅是一次。我曾经遇到过这种情况。 - Vince