v.getTag () возвращает ноль вместо ViewHolder - PullRequest
20 голосов
/ 22 июля 2011

У меня есть настроенный адаптер с заголовком и настроенными строками.Иногда мой v.getTag () возвращает ноль, где я хранил свой 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());                            

    }

Кто-нибудь может мне помочь?

1 Ответ

39 голосов
/ 22 июля 2011

Здесь вы используете стандартный шаблон для пользовательского ListAdapter. Не все виды будут переработаны, например когда они впервые созданы для заполнения ListView.

Вы также можете использовать ссылку 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.

...