Итак, я использую хорошо известный шаблон ViewHolder в своем приложении. Мой ViewHolder:Проблема с шаблоном ViewHolder
protected static class ViewHolder{
final ImageView itemImage;
final TextView txtName;
final TextView txtTitle;
final WebView webView;
public ViewHolder (final ImageView itemImage, final TextView txtName, final TextView txtTitle, final WebView webView){
this.itemImage = itemImage;
this.txtName = txtName;
this.txtTitle = txtTitle;
this.webView = webView;
}
public ViewHolder (View convertView){
itemImage = (ImageView) convertView.findViewById(R.id.fav_item_icon);
txtName = (TextView) convertView.findViewById(R.id.fav_item_name);
txtTitle = (TextView) convertView.findViewById(R.id.fav_item_title);
webView = (WebView) convertView.findViewById(R.id.fav_webView);
}
}
Так что все работает нормально, если я использую его с 1-го конструктора, как:
...
public View getView(final int position, View convertView, final ViewGroup parent) {
final Searchable searchResultsItem = searchResults.get(position);
ViewHolder viewHolder = null;
if (convertView==null){
convertView = inflater.inflate(R.layout.search_list_item, null);
final ImageView itemImage = (ImageView) convertView.findViewById(R.id.search_item_icon);
final TextView txtName = (TextView) convertView.findViewById(R.id.search_item_name);
final TextView txtTitle = (TextView) convertView.findViewById(R.id.search_item_title);
final WebView webView = (WebView) convertView.findViewById(R.id.search_webView);
viewHolder = new ViewHolder(itemImage, txtName, txtTitle, webView);
convertView.setTag(viewHolder);
}else
viewHolder = (ViewHolder)convertView.getTag();
viewHolder.webView.setFocusable(false);
...
но терпит неудачу, если я пытаюсь использовать 2-й конструктор:
...
public View getView(final int position, View convertView, final ViewGroup parent) {
final Searchable searchResultsItem = searchResults.get(position);
ViewHolder viewHolder = null;
if (convertView==null){
convertView = inflater.inflate(R.layout.search_list_item, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
}else
viewHolder = (ViewHolder)convertView.getTag();
viewHolder.webView.setFocusable(false);
...
It сбои с NPE по строке viewHolder.webView.setFocusable(false)
. Когда я пытаюсь отлаживать, он говорит, что созданный экземпляр ViewHolder имеет все поля null. Почему это может произойти?
OMG, спасибо. Его все о моей глупой копии. Код выглядит очень похоже, поэтому я этого не заметил. – Stan
Любопытно, что вы используете веб-просмотр в каждом экземпляре ListViewItem. Насколько стабильно это приложение? –
Ну, я не могу сказать точно. По крайней мере, я не сталкивался с какой-либо ошибкой, связанной с WebView. Мне не понравилась идея с веб-просмотрами в элементах ListView, но я не могу ее изменить (cuz API отправляет мне html-страницы в качестве информации для отображения). Я могу с уверенностью сказать, что эта схема создает задержки при прокрутке ListView, а также ее слишком медленную с точки зрения обновления при прокрутке ListView. – Stan