v.getTag()返回null而不是ViewHolder

我有一个自定义的适配器,有一个标题和自定义的行。 有时我的v.getTag()返回null,我已经存储了我的ViewHolder。 这不是一直发生,我无法弄清楚何时何地发生。

@Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; //Header if(items.hasDescription() && 0 == position) { LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.app_list_header, null); ((TextView) v.findViewById(R.id.app_list_header_description_text)).setText(items.getDescription()); return v; } ViewHolder holder; // Inflate app view. if (v == null || v.getTag() == null) { LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(textViewResourceId, null); //TODO: parent instead of null? holder = new ViewHolder(); holder.title = (TextView) v.findViewById(R.id.title); holder.company = (TextView) v.findViewById(R.id.company); holder.priceOrStatus = (TextView) v.findViewById(R.id.price); holder.rating = (RatingBar) v.findViewById(R.id.rating); holder.icon = (ImageView) v.findViewById(R.id.icon); v.setTag(holder); } else { holder = (ViewHolder) v.getTag(); } } App app; if(items.hasDescription()) { app = items.get(position-1); } else { app = items.get(position); } // TODO: Do we need this? if (null == app || null == holder) { Log.d(TAG, "app: " +app +" holder: " +holder); return v; } //TODO: FIX THE XML BEFORE SO WE DO NOT NEED TO TRIM IT. // And get rid of all these ifs!! if(holder.title != null) { holder.title.setText(app.getTitle().trim()); } 

谁能帮我吗?

Solutions Collecting From Web of "v.getTag()返回null而不是ViewHolder"

您在这里使用自定义ListAdapter的标准模式。 不是所有的视图都会被回收,例如当它们被首次创build来填充ListView

您可能LayoutInflater在创build适配器时参考LayoutInflater来稍微提高效率,请参阅下面的代码片段

  private class AlertListAdapter extends ArrayAdapter< Alert > { private ViewHolder holder; private LayoutInflater mInflater; public AlertListAdapter( Context context, List< Alert > items ) { super( context, R.layout.dashboard_layout, items ); mInflater = LayoutInflater.from( context ); } public View getView( int position, View recycledView, ViewGroup parent ) { if ( recycledView == null || recycledView.getTag() == null ) { recycledView = mInflater.inflate( R.layout.list_item, null ); holder = new ViewHolder(); holder.header = ( LinearLayout ) recycledView.findViewById( R.id.alert_list_item_header ); holder.header_text = ( TextView ) recycledView.findViewById( R.id.alert_list_item_header_text ); holder.header_count = ( TextView ) recycledView.findViewById( R.id.alert_list_item_header_count ); holder.name = ( TextView ) recycledView.findViewById( R.id.alert_list_item_name ); holder.distance = ( TextView ) recycledView.findViewById( R.id.alert_list_item_distance ); recycledView.setTag( holder ); } else { holder = ( ViewHolder ) recycledView.getTag(); } holder.header_text.setText( title.substring( 0, space ) ); holder.name.setText( title.substring( space + 1 ) ); holder.header_count.setText( count ); holder.header.setBackgroundResource( resourceID ); return recycledView; } } 

基本上,您必须始终为v.getTag()准备好返回null并相应地给一个新的View充气。