2015-02-13 8 views
8

Ho creato un layout con un ListView che aggiorna i valori in esso a seconda di quale dei 2 pulsanti dati vengono premuti. Premendo il pulsante con l'etichetta Odds si cancellano tutti i valori e si aggiungono i numeri dispari fino a 20. La pressione di altri fa lo stesso eccetto per i numeri pari. Funziona bene se emulato o provato su un dispositivo reale. Di seguito è riportato il codice dell'attività.Test di Robolectric ListView non si aggiorna dopo i cambiamenti di valore nell'adattatore

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

Tuttavia quando si cerca di testare con la Robolectric ListView non è mai aggiornato, anche se l'adattatore ha modifiche di valore. Ecco il mio codice di prova.

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

} 

Potete per favore fatemelo sapere che cosa devo fare per attivare l'aggiornamento sul ListView attraverso Robolectric.

+0

In robolectric è necessario chiamare ShadowListView.populateItems() per ottenere le modifiche dell'adattatore ShadowListView shadowListView = Robolectric.shadowOf (listView); shadowListView.populateItems(); – nenick

+0

Grazie @nenick! Questo ha risolto il problema che stavo avendo. Non posso contrassegnarti come risposta corretta quando hai postato un commento. –

+0

ho usato il campo di inserimento sbagliato ^^ – nenick

risposta

10

In robolectric è necessario chiamare ShadowListView.populateItems() per ottenere l'adattatore cambia

Robolectric 3,0

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

Robolectric 2,0

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

solo per aggiornare la risposta a Robolectric 3,0

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