Extract ListViewAdapter to own class

For now, it's equivalent to what it was, but this allows replacing the
layout with our own that we add callbacks to.