An ArrayAdapter is really cool. You can take any list of data and have it display in a ListView with next to no code.
Lets make a ListView full of Animals.
From here, we make a class that extends ArrayAdapter and overrides the getView method.
See how we call findViewById every time we create a row? Calling findViewById is an expensive operation, so caching the references will speed up your row creation by a lot.
Create a private inner class called Holder and add the TextView and ImageView as member variables.
Next, create a constructor that takes a row as a parameter.
Now add a method to Holder called setup that takes an Animal object as a parameter.
Our Holder class is complete! Remove the old code that finds the children Views and sets them up and replace them with the new methods you've written.
Here's the full code for this example:
Now the Adapter code is not only cleaner but it runs faster too.