2013-04-20 3 views
0

Итак, я использую хорошо известный шаблон 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. Почему это может произойти?

ответ

1

Иды кажутся разными, это намеренно?
final WebView webView = (WebView)convertView.findViewById(R.id.search_webView); R.id.search_webView (Это один работает)

и

webView = (WebView) convertView.findViewById(R.id.fav_webView);
R.id.fav_webView
(это один не работает)

+0

OMG, спасибо. Его все о моей глупой копии. Код выглядит очень похоже, поэтому я этого не заметил. – Stan

+0

Любопытно, что вы используете веб-просмотр в каждом экземпляре ListViewItem. Насколько стабильно это приложение? –

+0

Ну, я не могу сказать точно. По крайней мере, я не сталкивался с какой-либо ошибкой, связанной с WebView. Мне не понравилась идея с веб-просмотрами в элементах ListView, но я не могу ее изменить (cuz API отправляет мне html-страницы в качестве информации для отображения). Я могу с уверенностью сказать, что эта схема создает задержки при прокрутке ListView, а также ее слишком медленную с точки зрения обновления при прокрутке ListView. – Stan

Смежные вопросы