title: convertView in custom adapter with multiple line views
body: <p>I'm implementing custom adapter which handles multiple type of lines in a <code>listview</code> based on this (very useful) tutorial: <a href="http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/" rel="nofollow">http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/</a></p>
  
  <p>Now, I thought I understood everything but one thing puzzles me.
  In the getView method we receive the convertView which suppose to be the view (group) with specific layout to display in the specific line in the listview.</p>
  
  <pre><code>public View getView(int position, View convertView, ViewGroup parent) {
      //first get the animal from our data model
      Animal animal = animals.get(position);
  
      //if we have an image so we setup an the view for an image row
      if (animal.getImageId() != null) {
          ImageRowViewHolder holder;
          View view;
  
          //don't have a convert view so we're going to have to create a new one
          if (convertView == null) {
              ViewGroup viewGroup = (ViewGroup)LayoutInflater.from(AnimalHome.this)
                      .inflate(R.layout.image_row, null);
  
              //using the ViewHolder pattern to reduce lookups
              holder = new ImageRowViewHolder((ImageView)viewGroup.findViewById(R.id.image),
                          (TextView)viewGroup.findViewById(R.id.title));
              viewGroup.setTag(holder);
  
              view = viewGroup;
          }
          //we have a convertView so we're just going to use it's content
          else {
              //get the holder so we can set the image
              holder = (ImageRowViewHolder)convertView.getTag();
  
              view = convertView;
          }
  
          //actually set the contents based on our animal
          holder.imageView.setImageResource(animal.getImageId());
          holder.titleView.setText(animal.getName());
  
          return view;
      }
      //basically the same as above but for a layout with title and description
      else {
          DescriptionRowViewHolder holder;
          View view;
          if (convertView == null) {
              ViewGroup viewGroup = (ViewGroup)LayoutInflater.from(AnimalHome.this)
                      .inflate(R.layout.text_row, null);
              holder = new DescriptionRowViewHolder((TextView)viewGroup.findViewById(R.id.title),
                      (TextView)viewGroup.findViewById(R.id.description));
              viewGroup.setTag(holder);
              view = viewGroup;
          } else {
              view = convertView;
              holder = (DescriptionRowViewHolder)convertView.getTag();
          }
  
          holder.descriptionView.setText(animal.getDescription());
          holder.titleView.setText(animal.getName());
  
          return view;
      }
  }
  </code></pre>
  
  <p>However, in the case of multiple types of lines in the <code>listview</code> (for example, list of animals with separators lines with titles like 'mamals','fish','birds') how does the <code>listview</code> know what <code>convertView</code> to send? it can be one of two completely different types. something is very unclear to me. can someone explain please?</p>