Android - Adapter

> Android

1 - About

An Adapter (widget) object acts as a bridge between:

  • an AdapterView (An AdapterView is a view whose children are determined by an Adapter. See subclasses of AdapterView such as listView, GridView … )
  • and the underlying data for that view.

The Adapter:

  • provides access to the data items.
  • is also responsible for making a View for each item in the data set.

An adapter pulls content from a source such as an array or database query and converts each item result into a view that's placed into the container.

3 - Multiple Views

Every adapter Implements a BaseAdapter

// The static constant can never be greater than the number returned by the function getViewTypeCount
// That's why they start with 0.
private static final int VIEW_TYPE_ONE = 0;
private static final int VIEW_TYPE_TWO = 1;
 
@Override
public int getViewTypeCount() {
      return 2; // for two views
}
 
@Override
public int getItemViewType(in position) {
    return (position==0) ? VIEW_TYPE_ONE : VIEW_TYPE_TWO;
}
 
/**
* Create the view during runTime
*/
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
 
	// Choose the layout type
	int viewType = getItemViewType(cursor.getPosition());
	int layoutId;
 
	// Inflate the layout
	switch (viewType) {
		case VIEW_TYPE_ONE:
			layoutId = R.layout.list_item_one;
			break;
		default:
			layoutId = R.layout.list_item_Two;
	}
 
        View view = LayoutInflater.from(context).inflate(layoutId, parent, false);
 
        // See viewHolder section below
        // The XML parse operations is hold in an object to avoid 
        // to do it twice by using the lookup function findViewById
        ViewHolder viewHolder = new ViewHolder(view);
        view.setTag(viewHolder);
 
        // We return the view
	return view;
 
}
Advertising

4 - ViewHolder

The findViewById method of a view looks up for a child view. It's a costly function therefore it's a good practice to hold the result of this function in a ViewHolder.

A ViewHolder object stores each of the component views inside the tag field of the parent view.

Example:

  • Declaration
static class ViewHolder {
  ImageView iconView;
  TextView textView;
  TextView dateView;
}
  • Instantiation
ViewHolder holder = new ViewHolder();
holder.iconView = (ImageView) parentView.findViewById(R.id.listitem_image);
holder.textView = (TextView) parentView.findViewById(R.id.listitem_text);
holder.dateView = (TextView) parentView.findViewById(R.id.listitem_date);
parentView.setTag(holder);
  • Use
ViewHolder viewHolder = (ViewHolder) view.getTag();
viewHolder.iconView.setImageResource();
viewHolder.textView.setText("Text");
viewHolder.dateView.setText("YYYYMMDD");

See:

  • ViewHolder pattern documentation.
  • this example adapter ForecastAdapter.java of the sunshine app:
    • The inner static viewHolderClass (Declaration)
    • The function newView (Instantiation)
    • The function bindView (Usage)
Advertising