0

そのため、アプリでよく知られている 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);
    }
}

したがって、次のような最初のコンストラクターで使用すると、すべて正常に動作します。

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

行の NPE でクラッシュしviewHolder.webView.setFocusable(false)ます。デバッグしようとすると、作成された ViewHolder インスタンスにはすべてのフィールドが null と表示されます。なぜこれが起こるのでしょうか?

4

1 に答える 1

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
(これは機能しません)

于 2013-04-20T00:50:14.987 に答える