Intereting Posts
База данных LocalStorage vs Sqlite Как я могу выделить более 1024 МБ ОЗУ на AVD? Странное поведение гибридного приложения на основе CrossWalk при воспроизведении веб-аудио m4a Предотвращение отклонения ProgressDialog при нажатии кнопки поиска (Android) Не удается получить viewWidth после первого макета (WebView в ViewPager) Как добавить имена класса и функции автоматически в мой журнал Проблемы подключения HttpsURLConnection Mylib.so имеет перестановки текста. Это трата памяти и представляет угрозу безопасности. Пожалуйста исправьте Приложение отсутствует в Android Market Как настроить Admob с помощью Adobe AIR для Android Есть ли правильный способ проверить, действительно ли предоставленный пользователем пароль SQLCipher действителен на Android? Как отключить горизонтальную прокрутку в веб-браузере Android Как читать файл csv в android? Новый проект создает проблему после обновления Android SDK Обои ImageView внутри пользовательского представления не отображаются на некоторых устройствах

В чем разница между двумя типами реализации getView ()?

Может кто-нибудь объяснить, в чем разница между двумя видами реализации getView ()?

Первый просто проверяет, является ли convertView нулевым; Если он равен нулю, раздуйте новый объект View. Затем установите под-представления с соответствующими значениями.

 @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { LayoutInflater inflater = context.getLayoutInflater(); convertView = inflater.inflate(R.layout.itemlayout, null, true); } ImageView image = (ImageView) convertView.findViewById(R.id.icon); TextView text = (TextView) convertView.findViewById(R.id.name); MyItem item = items[position]; text.setText(item.name); if("male".equals(item.gender)) { image.setImageResource(R.drawable.male); } else if("female".equals(item.gender)) { image.setImageResource(R.drawable.female); } return convertView; } 

Второй – это так называемый шаблон «ViewHolder». Многие разработчики говорят, что этот метод экономит много памяти и процессорного времени. Но первая реализация также проверяет существование convertView. Не сохраняет ли первый метод память? Может ли кто-нибудь объяснить разницу между двумя реализациями более глубоко и четко? Огромное спасибо.

 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; View itemView = convertView; if(itemView == null) { LayoutInflater inflater = context.getLayoutInflater(); itemView = inflater.inflate(R.layout.itemlayout, null, true); holder = new ViewHolder(); holder.image = (ImageView) itemView.findViewById(R.id.icon); holder.text = (TextView) itemView.findViewById(R.id.name); itemView.setTag(holder); } else { holder = (ViewHolder) itemView.getTag(); } MyItem item = items[position]; holder.text.setText(item.name); if("male".equals(item.gender)) { holder.image.setImageResource(R.drawable.male); } else if("female".equals(item.gender)) { holder.image.setImageResource(R.drawable.female); } return itemView; } 

Второй шаблон создает статический экземпляр ViewHolder и присоединяет его к элементу представления при первом его загрузке, а затем он будет извлекаться из этого тега просмотра при последующих вызовах

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

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

Использование viewHolder предотвращает вызов findviewById () каждый раз, когда представление должно быть привязано к экрану. Это означает, что представление завышено и ресурсы, связанные с ним, инициализируются только один раз (инфляция, findById, слушатели, контент, который не изменится, как статические заголовки или что-то еще). Поэтому использование этого дает лучшую производительность при работе со списками, таким образом, всегда рекомендуемый метод.