【问题标题】:Android Robolectric Click RecyclerView ItemAndroid Robolectric Click RecyclerView Item
【发布时间】:2014-11-21 01:46:45
【问题描述】:

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

到目前为止,我已经尝试将View 放在RecyclerView 的第一个可见位置,但始终是null。它是getChildCount() 不断返回0,而findViewHolderForPosition 始终是null。适配器从getItemCount() 返回一个非0 数(适配器中肯定有项目)。

我正在使用 Robolectric 2.4 SNAPSHOT。

【问题讨论】:

    标签: android robolectric android-recyclerview


    【解决方案1】:

    似乎问题在于RecyclerView 需要在 Robolectric 中手动测量和布局。调用它可以解决问题:

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

    【讨论】:

    • 这是一个很棒的发现。谢谢你。请问你是怎么发现回收站视图没有被测量和布局的?这对我真的很有帮助。
    • 你在哪里添加度量和布局?在测试本身的 findViewById 之后?
    • 没有一个特定的地方可以这样做;我有时会在findViewById 之后执行此操作,但我通常会在需要它之前执行此操作。
    • 另外,这段代码的调用次数应该与您在适配器上调用notifyDatasetChanged() 或类似方法的次数一样多,而不仅仅是一次。它只是发生在我身上。
    • 嗨@Eliezer,谢谢你的回答。我一直在寻找一段时间,这有效。如果可能的话,你是怎么想出来的?我想知道以增加我对 Android 的了解。
    【解决方案2】:

    使用 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();
    

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

    【讨论】:

      【解决方案3】:

      扩展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();
      }
      

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

      【讨论】:

        【解决方案4】:

        只需调用

        Robolectric.flushForegroundThreadScheduler()
        

        在 performClick() 之前确保所有 ui 操作(包括填充数据集后回收器视图的测量和布局阶段)完成

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-03
          • 1970-01-01
          • 2023-02-06
          • 2013-04-14
          • 2020-07-29
          • 1970-01-01
          相关资源
          最近更新 更多