2013-04-20 71 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); 
    ... 

,但如果我嘗試使用第二個構造失敗:

... 
       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); 
    ... 

它在線viewHolder.webView.setFocusable(false)與NPE碰撞。當我嘗試調試它說創建的ViewHolder實例的所有字段爲空。爲什麼會發生?

回答

1

這個id看起來不一樣,那是故意的嗎?
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,謝謝。它的所有關於我的愚蠢copypaste :)代碼看起來非常相似,所以我沒有注意到這一點。 – Stan 2013-04-20 05:35:36

+0

有趣的是,您在ListViewItem的每個實例中都使用了webview。它的應用程序有多穩定? – 2013-04-20 20:55:14

+0

我不能肯定地說。至少我沒有遇到與WebView相關的任何錯誤。我不喜歡在ListView項目中使用webviews的想法,但我不能改變它(cuz API發送給我的HTML頁面作爲信息顯示)。我可以肯定地說,這個模式在ListView滾動上產生滯後,而且在滾動ListView時刷新方面速度太慢。確切地說, – Stan 2013-04-22 07:39:32