2015-02-13 15 views
8

Ich habe ein Layout mit einer ListView erstellt, die Werte darin aktualisiert, je nachdem, welche der 2 angegebenen Tasten gedrückt wird. Durch Drücken der Taste mit der Bezeichnung Odds werden alle Werte gelöscht und ungerade Zahlen bis zu 20 hinzugefügt. Das Drücken von Evens macht dasselbe, außer geraden Zahlen. Dies funktioniert gut, wenn es auf einem echten Gerät emuliert oder versucht wird. Unten ist der Aktivitätscode.Robolectric Test ListView wird nicht aktualisiert nach Wertänderungen im Adapter

public class ListViewActivity extends Activity { 

    private ListView mainListView; 
    private ArrayAdapter<String> listAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.robolectric_test_main); 

     mainListView = (ListView) findViewById(R.id.mainListView); 

     ArrayList<String> numbersList = new ArrayList<String>(); 
     for (int i = 1; i < 21; i++) { 
      numbersList.add(String.valueOf(i)); 
     } 

     listAdapter = new ArrayAdapter<String>(this, R.layout.robolectric_listview_row, numbersList); 

     mainListView.setAdapter(listAdapter); 
    } 

    public void onOddsClicked(View view) { 
     listAdapter.clear(); 
     for (int i = 1; i < 21; i += 2) { 
      listAdapter.add(String.valueOf(i)); 
     } 
    } 

    public void onEvensClicked(View view) { 
     listAdapter.clear(); 
     for (int i = 2; i < 21; i += 2) { 
      listAdapter.add(String.valueOf(i)); 
     } 
    } 
} 

jedoch bei dem Versuch, es mit Robolectric zu testen, die ListView nicht einmal aktualisiert wird, obwohl die Adapter Wertänderungen hat. Hier ist mein Testcode.

@RunWith(RobolectricTestRunner.class) 
public class ListViewActivityTest { 

    private ListViewActivity listViewActivity; 
    private Button oddsButton; 
    private Button evensButton; 
    private ListView numbersList; 

    @Before 
    public void setUp() throws Exception { 
     listViewActivity = Robolectric.buildActivity(ListViewActivity.class).create().start().resume().visible().get(); 
     assignFields(); 
    } 

    private void assignFields() { 
     oddsButton = (Button) listViewActivity.findViewById(R.id.oddsButton); 
     evensButton = (Button) listViewActivity.findViewById(R.id.evensButton); 
     numbersList = (ListView) listViewActivity.findViewById(R.id.mainListView); 
    } 

    @Test 
    public void odds() throws Exception { 
     // check all numbers are odd 
     Robolectric.clickOn(oddsButton); 
     Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
     for (int i = 0; i < numbersList.getChildCount(); i++) { 
      TextView number = (TextView) numbersList.getChildAt(i); 
      String numberString = number.getText().toString(); 
      int parsedInt = Integer.parseInt(numberString); 
      assertTrue((parsedInt % 2) == 1); 
     } 
    } 

    @Test 
    public void evens() throws Exception { 
     // check all numbers are even 
     Robolectric.clickOn(evensButton); 
     Robolectric.runUiThreadTasksIncludingDelayedTasks(); 
     for (int i = 0; i < numbersList.getChildCount(); i++) { 
      TextView number = (TextView) numbersList.getChildAt(i); 
      String numberString = number.getText().toString(); 
      int parsedInt = Integer.parseInt(numberString); 
      assertTrue((parsedInt % 2) == 0); 
     } 
    } 

} 

Können Sie bitte lassen Sie mich wissen, was ich damit tun müssen, um das Update auf dem ListView durch Robolectric auszulösen.

+0

In roboclectric müssen Sie ShadowListView.populateItems() aufrufen, um Adapteränderungen zu erhalten ShadowListView shadowListView = Robolectric.shadowOf (listView); shadowListView.populateItems(); – nenick

+0

Danke @nenick! Damit war das Problem gelöst, das ich hatte. Ich kann Sie nicht als richtige Antwort markieren, da Sie einen Kommentar geschrieben haben. –

+0

Ich habe das falsche Eingabefeld verwendet ^^ – nenick

Antwort

10

In robolectric müssen Sie ShadowListView.populateItems() rufen Adapter zu erhalten ändert

Robolectric 3,0

ShadowListView shadowListView = Shadows.shadowOf(mListView); 
shadowListView.populateItems(); 

Robolectric 2,0

ShadowListView shadowListView = Robolectric.shadowOf(listView); 
shadowListView.populateItems(); 
4

einfach die Antwort auf Robolectric aktualisieren 3,0

ShadowListView shadowListView = Shadows.shadowOf(mListView); 
    shadowListView.populateItems(); 
Verwandte Themen