code: package de.itemis.base;
  
  import android.app.ListActivity;
  import android.graphics.drawable.Drawable;
  import android.view.View;
  import android.widget.ImageView;
  import android.widget.TextView;
  import de.itemis.itemisapp.R;
  
  public abstract class RowAdapter<T> extends AbstractRowAdapter {
  
  	private final T item;
  	private TextView textView;
  	private TextView detailsView;
  	private ImageView imageView;
  	
  	public RowAdapter(T item) {
  		this.item = item;
  	}
  	
  	public T getItem() {
  		return item;
  	}
  	
  	@Override
  	protected void beforePopulateRowView() {
  		super.beforePopulateRowView();
  		textView = null;
  		detailsView = null;
  		imageView = null;
  	}
  	
  	@Override
  	protected void afterPopulateRowView() {
  		applyVisibility(textView, getTextView());
  		applyVisibility(detailsView, getDetailsView());
  		applyVisibility(imageView, getImageView());
  		super.afterPopulateRowView();
  	}
  
  	private void applyVisibility(View viewWithState, View viewToChange) {
  		if(viewToChange == null)
  			return;
  		
  		if(viewWithState != null)
  			viewToChange.setVisibility(View.VISIBLE);
  		else
  			viewToChange.setVisibility(View.GONE);
  	}
  
  	public abstract int getViewResourceID();
  
  	@Override
  	public View createView(ListActivity activity) {
  		return activity.getLayoutInflater().inflate(getViewResourceID(), null);
  	}
  	
  	protected void setImageURL(String url) {
  		Drawable drawable = Cache.getDrawable(getActivity(), url, "@drawable/loading_photo"); 
  		getImageView().setImageDrawable(drawable);
  	}
  	
  	protected ImageView getImageView() {
  		if (imageView == null) {
  			imageView = (ImageView) getRowView().findViewById(de.itemis.itemisapp.R.id.image);
  			
  		}
  		return imageView;
  	}
  	
  	public void setText(String text) {
  		getTextView().setText(text);
  	}
  	
  	public TextView getTextView() {
  		if (textView == null) {
  			textView = (TextView) getRowView().findViewById(de.itemis.itemisapp.R.id.text);
  		}
  		return textView;
  	}
  	
  	public void setDetails(String details) {
  		getDetailsView().setText(details);
  	}
  	
  	protected TextView getDetailsView() {
  		if (detailsView == null) {
  			detailsView = (TextView) getRowView().findViewById(de.itemis.itemisapp.R.id.details);
  		}
  		return detailsView;
  	}
  	
  	public void setQuery(String query) {
  		// TODO: find a more generic way to determine dimensions of image
  		int width = 120;
  		int height = 120;
  		if(query==null)
  			query = "";
  		String url = "http://maps.google.com/maps/api/staticmap?"
  			+ "center=" + StringUtils.urlconform(query) + "&"
  			+ "maptype=roadmap&sensor=false&"
  			+ "size=" + width + "x" + height + "&zoom=15";
  		setImageURL(url); 
  	}
  
  	public abstract static class Default<T> extends RowAdapter<T> {
  
  		public Default(T item) {
  			super(item);
  		}
  
  		@Override
  		public int getViewResourceID() {
  			return R.layout.default_item;
  		}
  
  		
  	}
  	
  	public abstract static class DefaultWithDisclosure<T> extends Default<T> {
  
  		public DefaultWithDisclosure(T item) {
  			super(item);
  		}
  		
  	}
  	
  	public abstract static class Subtitle<T> extends Default<T> {
  
  		public Subtitle(T item) {
  			super(item);
  		}
  		
  	}
  
  	public abstract static class Value2<T> extends RowAdapter<T> {
  
  		public Value2(T item) {
  			super(item);
  		}
  
  		@Override
  		public int getViewResourceID() {
  			return R.layout.value2_item;
  		}
  		
  	}
  	
  	public abstract static class Map<T> extends RowAdapter<T> {
  		public Map(T item) {
  			super(item);
  		}
  		
  		@Override
  		public int getViewResourceID() {
  			return R.layout.map_item;
  		}	 
  	}
  
  	
  
  }
  