Здраво! коллеги-разработчики Android.

Этот пост об ошибке новичка, которую, как я понял, я делал в течение некоторого времени.

Написание специального адаптера для наших представлений в Android - очень распространенное явление. Пользовательские адаптеры, как следует из названия, используются, если мы хотим расширить наше представление с помощью настраиваемого макета.

Я пишу этот пост, потому что в течение некоторого времени я совершал ошибку новичка, и когда я спросил об этом своих коллег-разработчиков, оказалось, что некоторые ранее совершали ту же ошибку, а некоторые не понимали, в чем именно заключалась польза от fix (о котором я напишу немного :).

Прежде чем углубиться в проблему, хочу отметить, что исправление может показаться скорее оптимизацией, чем ошибкой. Но как разработчики мы стремимся предоставить пользователям наилучшие возможности, и оптимизация помогает нам в этом. Так что назвать это ошибкой не может быть ошибкой. (можете не согласиться).

Итак, вот мой getView (), который я писал. Обратите внимание, что этот код правильный и даст желаемые результаты, но не оптимизирован!

public View getView(int position,View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView= inflater.inflate(R.layout.list_single, null);
//Do you tasks
TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);
txtTitle.setText(web[position]);
return rowView;
}
}

Я хочу сказать, что адаптеры созданы для повторного использования представлений. Когда представление прокручивается так, что оно больше не отображается, его можно использовать для одного из новых отображаемых представлений. Это повторно используемое представление - convertView. Если это null, это означает, что переработанного представления нет, и мы должны создать новый, в противном случае мы должны использовать его, чтобы избежать создания нового. Так что не надо каждый раз надувать !!!.

Таким образом, оптимизированный код будет:

public View getView(int position,View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView;
if(convertView == null){
    rowView= inflater.inflate(R.layout.list_single, null);
} else{
    rowView = convertView;  // recycle
}
//Do you tasks
TextView txtTitle = (TextView) rowView.findViewById(R.id.txt);
txtTitle.setText(web[position]);
return rowView;
}
}

Надеюсь, этот пост поможет всем начинающим разработчикам вроде меня;).