2014-11-21 22 views
17

Có cách nào để mô phỏng một cú nhấp chuột vào một mục RecyclerView với Robolectric không?Android Robolectric Click RecyclerView Mục

Cho đến giờ, tôi đã thử nhận được View ở vị trí hiển thị đầu tiên của RecyclerView, nhưng đó luôn là null. Đó là getChildCount() tiếp tục trả lại 0findViewHolderForPosition luôn là null. Bộ điều hợp trả về số không 0 từ getItemCount() (chắc chắn có các mục trong bộ điều hợp).

Tôi đang sử dụng Robolectric 2.4 SNAPSHOT.

Trả lời

35

Dường như vấn đề là cần phải đo và phân loại thủ công RecyclerView theo cách thủ công trong Robolectric. Kêu gọi này giải quyết vấn đề:

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

Đây là một tìm kiếm tuyệt vời. Cảm ơn vì điều đó. Tôi có thể hỏi làm thế nào bạn đã đi về việc tìm kiếm rằng xem tái chế không được đo và đặt ra? Nó sẽ thực sự hữu ích cho tôi. – c05mic

+0

Bạn thêm biện pháp và bố cục ở đâu? sau khi findViewById tự kiểm tra? – Jeroen

+0

Không có một nơi cụ thể để làm điều đó; Đôi khi tôi làm điều đó sau 'findViewById' nhưng tôi thường làm điều đó ngay trước khi tôi cần nó. – Eliezer

4

Với Robolectric 3 bạn có thể sử dụng có thể nhìn thấy():

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

này giúp loại bỏ sự cần thiết để kích hoạt các phép đo quan điểm bằng tay.

0

Mở rộng về câu trả lời Marco Hertwig 's:

Bạn cần phải thêm recyclerView đến một hoạt động do đó phương pháp bố trí của nó được gọi như mong đợi. Bạn có thể gọi chúng theo cách thủ công, (như trong câu trả lời của Elizer) nhưng bạn sẽ phải tự quản lý nhà nước. Ngoài ra, điều này sẽ không được mô phỏng một trường hợp sử dụng thực tế.

Code:

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

Bây giờ bạn không cần phải lo lắng về việc kêu gọi layoutmeasure mọi bạn recyclerView được cập nhật (bằng cách thêm/gỡ bỏ các mục từ adapter, ví dụ).

Các vấn đề liên quan