2011-07-22 16 views
20

ヘッダーとカスタマイズされた行を持つカスタマイズされたアダプタがあります。場合によっては、私のv.getTag()はViewHolderを保存した場所でnullを返します。それはいつも起こるわけではなく、いつ、そしてなぜそれが起こるのかを理解することはできません。v.getTag()は、ViewHolderの代わりにnullを返します。

@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());        

    } 

誰でもお手伝いできますか?

答えて

38

カスタムListAdapterの標準パターンを使用しています。たとえば、すべてのビューがリサイクルされるわけではありません。最初にListViewを埋め込むように作成されます。

ます。また、リファレンスをしたいことがありLayoutInflaterあなたは少し効率を改善するためのアダプタを作成する場合、基本的にあなたは常にnullを返すようにv.getTag()のために準備しなければならない

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; 
     } 
    } 

下にスニペットや新を膨らま見ますそれに応じてView

+4

INSANE!アンドロイド2.3は私にヌルタグを与え、アンドロイド3+は決してそれをしません。 – max4ever

+2

私のギャラクシーエースで私もこれを見ます。通常、getTagは常にホルダーを返します。しかし、これに基づいてgetTagが有効かどうか1つの_must_チェックに同意します。 – slott

関連する問題