Я посмотрел исходный код ArrayAdapter, и он уже выполняет весь этот процесс создания представления:
// citation from public class ArrayAdapter<T>
private View createViewFromResource(int position, View convertView, ViewGroup parent,
int resource) {
View view;
TextView text;
if (convertView == null) {
view = mInflater.inflate(resource, parent, false);
} else {
view = convertView;
}
Итак, мы должны просто использовать его:
lvShows.setAdapter(new ArrayAdapter<TvShow>(this,
R.layout.show_row,
R.id.nameField,
allKnownShows){
public View getView(int position, final View convertView, ViewGroup parent) {
LinearLayout showView = (LinearLayout) super.getView(position, convertView, parent);
setAnythingForItem(showView);
return showView;
}
Внимание: мы изменили конструктор!
ArrayAdapter позволяет использовать макет элемента без TextView.Но если это не сам TextView, он должен иметь его, и идентификатор этого самого внутреннего поля TextView должен быть передан конструктору в качестве третьего параметра.ArrayAdapter нужно, чтобы он был установлен, чтобы записывать туда Strings, если подключенный к нему массив имеет элементы String.
Он всегда хочет TextView, даже если он действительно не нужен, если массив состоит из объектов, а не строк.В противном случае он проверяет макет элемента на наличие TextView и, если это не так, выдает ошибку.