Da android docs - Un oggetto Adapter funge da ponte tra un AdapterView (come ListView nel tuo caso) e i dati sottostanti per quella vista. L'adattatore fornisce l'accesso agli elementi di dati ed è anche responsabile della creazione di una vista per ciascun elemento nel set di dati.
Pertanto, ogni volta che ListView deve visualizzare una particolare riga di dati, richiede all'adattatore associato di fornire la vista corrispondente a quella dei dati in quella posizione tramite il metodo getView(). Ciò può verificarsi ogni volta che la vista deve essere aggiornata sullo schermo (ad esempio durante la creazione/scorrimento ecc.).
Come sviluppatore di app, non è necessario preoccuparsi esattamente di quale punto viene chiamato getView() finché si fornisce un'implementazione concreta getView() nell'adattatore. Assicurati che il metodo sia efficiente (miniature ecc. Dovrebbero essere caricati in un thread in background) per prestazioni ottimali.
Fare riferimento a questo [LINK] (http://www.ezzylearning.com/tutorial.aspx?tid=1763429&q=customizing-android-listview-items-with-custom-arrayadapter) ha la spiegazione chiara e netta di CustomAdapter woth sample code –