diff --git a/res/layout-finger/contacts_list_item.xml b/res/layout-finger/contacts_list_item.xml
deleted file mode 100644
index 67de04d..0000000
--- a/res/layout-finger/contacts_list_item.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
->
-    <include
-        android:id="@+id/header"
-        layout="@layout/list_section"
-    />
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="?android:attr/listPreferredItemHeight"
-        android:paddingLeft="14dip"
-    >
-
-        <include
-            android:id="@+id/right_side"
-            layout="@layout/contacts_list_item_presence_and_action"
-        />
-
-        <TextView android:id="@+id/label"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentLeft="true"
-            android:layout_alignParentBottom="true"
-            android:layout_marginBottom="8dip"
-            android:layout_marginTop="-8dip"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textStyle="bold"
-        />
-
-        <TextView android:id="@+id/data"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="5dip"
-            android:layout_toRightOf="@id/label"
-            android:layout_toLeftOf="@id/right_side"
-            android:layout_alignBaseline="@id/label"
-            android:layout_alignWithParentIfMissing="true"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-        />
-
-        <TextView android:id="@+id/name"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            android:layout_alignParentLeft="true"
-            android:layout_marginBottom="1dip"
-            android:layout_toLeftOf="@id/right_side"
-            android:layout_alignParentTop="true"
-            android:layout_above="@id/label"
-            android:layout_alignWithParentIfMissing="true"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:gravity="center_vertical|left"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-        />
-    </RelativeLayout>
-
-    <View android:id="@+id/list_divider"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@*android:drawable/divider_horizontal_dark_opaque"
-    />
-</LinearLayout>
diff --git a/res/layout-finger/contacts_list_item_photo.xml b/res/layout-finger/contacts_list_item_photo.xml
deleted file mode 100644
index cad1bb9..0000000
--- a/res/layout-finger/contacts_list_item_photo.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
->
-    <include
-        android:id="@+id/header"
-        layout="@layout/list_section"
-    />
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="?android:attr/listPreferredItemHeight"
-        android:paddingLeft="4dip"
-    >
-
-        <include
-            android:id="@+id/right_side"
-            layout="@layout/contacts_list_item_presence_and_action"
-        />
-
-        <android.widget.QuickContactBadge android:id="@+id/photo"
-            android:layout_alignParentLeft="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="8dip"
-            style="?android:attr/quickContactBadgeStyleWindowMedium"
-        />
-
-        <ImageView android:id="@+id/noQuickContactPhoto"
-            android:layout_alignParentLeft="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="8dip"
-            android:background="@null"
-            style="?android:attr/quickContactBadgeStyleWindowMedium"
-        />
-
-        <TextView android:id="@+id/label"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/photo"
-            android:layout_alignParentBottom="true"
-            android:layout_marginBottom="8dip"
-            android:layout_marginTop="-10dip"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textStyle="bold"
-        />
-
-        <TextView android:id="@+id/data"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="5dip"
-            android:layout_toRightOf="@id/label"
-            android:layout_toLeftOf="@id/right_side"
-            android:layout_alignBaseline="@id/label"
-            android:layout_alignWithParentIfMissing="true"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-        />
-
-        <TextView android:id="@+id/name"
-            android:layout_width="0dip"
-            android:layout_height="0dip"
-            android:layout_toRightOf="@id/photo"
-            android:layout_toLeftOf="@id/right_side"
-            android:layout_alignParentTop="true"
-            android:layout_above="@id/label"
-            android:layout_alignWithParentIfMissing="true"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:gravity="center_vertical|left"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-        />
-    </RelativeLayout>
-
-    <View android:id="@+id/list_divider"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@*android:drawable/divider_horizontal_dark_opaque"
-    />
-</LinearLayout>
diff --git a/res/layout-finger/contacts_list_item_photo_and_snippet.xml b/res/layout-finger/contacts_list_item_photo_and_snippet.xml
deleted file mode 100644
index 74e8f7e..0000000
--- a/res/layout-finger/contacts_list_item_photo_and_snippet.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2009, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
->
-    <include
-        android:id="@+id/header"
-        layout="@layout/list_section"
-    />
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="?android:attr/listPreferredItemHeight"
-        android:paddingLeft="4dip"
-    >
-
-        <include
-            android:id="@+id/right_side"
-            layout="@layout/contacts_list_item_presence_and_action"
-        />
-
-        <android.widget.QuickContactBadge android:id="@+id/photo"
-            android:layout_alignParentLeft="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="8dip"
-            style="?android:attr/quickContactBadgeStyleWindowMedium"
-        />
-
-        <ImageView android:id="@+id/noQuickContactPhoto"
-            android:layout_alignParentLeft="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="8dip"
-            android:background="@null"
-            style="?android:attr/quickContactBadgeStyleWindowMedium"
-        />
-
-        <TextView android:id="@+id/label"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/photo"
-            android:layout_alignParentBottom="true"
-            android:layout_marginBottom="3dip"
-            android:layout_marginTop="-7dip"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textStyle="bold"
-        />
-
-        <TextView android:id="@+id/data"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="5dip"
-            android:layout_toRightOf="@id/label"
-            android:layout_toLeftOf="@id/right_side"
-            android:layout_alignBaseline="@id/label"
-            android:layout_alignWithParentIfMissing="true"
-
-            android:singleLine="true"
-            android:ellipsize="marquee"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-        />
-
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/photo"
-            android:layout_toLeftOf="@id/right_side"
-            android:layout_above="@id/label"
-            android:layout_alignParentTop="true"
-            android:layout_alignWithParentIfMissing="true"
-            android:gravity="center_vertical|left"
-            >
-
-            <TextView android:id="@+id/name"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_alignParentTop="true"
-
-                android:singleLine="true"
-                android:ellipsize="marquee"
-                android:textAppearance="?android:attr/textAppearanceLarge"
-            />
-
-            <TextView android:id="@+id/snippet"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_below="@id/name"
-                android:layout_alignWithParentIfMissing="true"
-                android:layout_marginTop="-5dip"
-                android:layout_marginBottom="3dip"
-
-                android:singleLine="true"
-                android:ellipsize="marquee"
-                android:textAppearance="?android:attr/textAppearanceSmall"
-                android:textStyle="bold"
-                
-            />
-        </RelativeLayout>
-    </RelativeLayout>
-
-    <View android:id="@+id/list_divider"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@*android:drawable/divider_horizontal_dark_opaque"
-    />
-</LinearLayout>
diff --git a/res/layout-finger/contacts_list_item_presence_and_action.xml b/res/layout-finger/contacts_list_item_presence_and_action.xml
deleted file mode 100644
index 80b275f..0000000
--- a/res/layout-finger/contacts_list_item_presence_and_action.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 2010, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:orientation="horizontal"
-    android:layout_marginLeft="11dip"
-    android:layout_alignParentRight="true">
-
-    <ImageView android:id="@+id/presence"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="5dip"
-        android:layout_marginRight="5dip"
-        android:padding="7dip"
-        android:layout_gravity="center_vertical"
-        android:scaleType="centerInside"
-    />
-
-    <LinearLayout android:id="@+id/call_view"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:orientation="horizontal">
-
-        <View android:id="@+id/divider"
-            android:layout_width="1px"
-            android:layout_height="match_parent"
-            android:layout_marginTop="5dip"
-            android:layout_marginBottom="5dip"
-            android:background="@drawable/divider_vertical_dark"
-        />
-
-        <view
-            class="com.android.contacts.ui.widget.DontPressWithParentImageView"
-            android:id="@+id/call_button"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:paddingLeft="14dip"
-            android:paddingRight="14dip"
-            android:layout_centerVertical="true"
-            android:gravity="center"
-            android:src="@android:drawable/sym_action_call"
-            android:background="@drawable/call_background"
-        />
-
-    </LinearLayout>
-</LinearLayout>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 25189db..4a7a743 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -27,4 +27,16 @@
     
     <dimen name="contact_shortcut_frame_width">50dip</dimen>    
     <dimen name="contact_shortcut_frame_height">56dip</dimen>    
+    
+    <!-- Dimensions for a list item -->
+    <dimen name="list_item_padding_top">4dip</dimen>    
+    <dimen name="list_item_padding_right">11dip</dimen>    
+    <dimen name="list_item_padding_bottom">4dip</dimen>    
+    <dimen name="list_item_padding_left">4dip</dimen>    
+    <dimen name="list_item_gap_between_image_and_text">8dip</dimen>    
+    <dimen name="list_item_gap_between_label_and_data">5dip</dimen>    
+    <dimen name="list_item_call_button_padding">14dip</dimen>    
+    <dimen name="list_item_vertical_divider_margin">5dip</dimen>    
+    <dimen name="list_item_presence_icon_margin">5dip</dimen>    
+    <dimen name="list_item_header_text_width">56dip</dimen>    
 </resources>
diff --git a/src/com/android/contacts/ContactListItemView.java b/src/com/android/contacts/ContactListItemView.java
new file mode 100644
index 0000000..5c6c149
--- /dev/null
+++ b/src/com/android/contacts/ContactListItemView.java
@@ -0,0 +1,587 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts;
+
+import com.android.contacts.ui.widget.DontPressWithParentImageView;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.provider.ContactsContract.Contacts;
+import android.text.TextUtils;
+import android.text.TextUtils.TruncateAt;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.QuickContactBadge;
+import android.widget.TextView;
+import android.widget.ImageView.ScaleType;
+
+/**
+ * A custom view for an item in the contact list.
+ */
+public class ContactListItemView extends ViewGroup {
+
+    private static final int QUICK_CONTACT_BADGE_STYLE =
+            com.android.internal.R.attr.quickContactBadgeStyleWindowMedium;
+
+    private final Context mContext;
+
+    private final int mPreferredHeight;
+    private final int mVerticalDividerMargin;
+    private final int mPaddingTop;
+    private final int mPaddingRight;
+    private final int mPaddingBottom;
+    private final int mPaddingLeft;
+    private final int mGapBetweenImageAndText;
+    private final int mGapBetweenLabelAndData;
+    private final int mCallButtonPadding;
+    private final int mPresenceIconMargin;
+    private final int mHeaderTextWidth;
+
+    private boolean mHorizontalDividerVisible;
+    private Drawable mHorizontalDividerDrawable;
+    private int mHorizontalDividerHeight;
+
+    private boolean mVerticalDividerVisible;
+    private Drawable mVerticalDividerDrawable;
+    private int mVerticalDividerWidth;
+
+    private boolean mHeaderVisible;
+    private Drawable mHeaderBackgroundDrawable;
+    private int mHeaderBackgroundHeight;
+    private TextView mHeaderTextView;
+
+    private QuickContactBadge mQuickContact;
+    private ImageView mPhotoView;
+    private TextView mNameTextView;
+    private DontPressWithParentImageView mCallButton;
+    private TextView mLabelView;
+    private TextView mDataView;
+    private TextView mSnippetView;
+    private ImageView mPresenceIcon;
+
+    private int mPhotoViewWidth;
+    private int mPhotoViewHeight;
+    private int mLine1Height;
+    private int mLine2Height;
+    private int mLine3Height;
+
+    private OnClickListener mCallButtonClickListener;
+
+    public ContactListItemView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+
+        // Obtain preferred item height from the current theme
+        TypedArray a = context.obtainStyledAttributes(null, com.android.internal.R.styleable.Theme);
+        mPreferredHeight =
+                a.getDimensionPixelSize(android.R.styleable.Theme_listPreferredItemHeight, 0);
+        a.recycle();
+
+        Resources resources = context.getResources();
+        mVerticalDividerMargin =
+                resources.getDimensionPixelOffset(R.dimen.list_item_vertical_divider_margin);
+        mPaddingTop =
+                resources.getDimensionPixelOffset(R.dimen.list_item_padding_top);
+        mPaddingBottom =
+                resources.getDimensionPixelOffset(R.dimen.list_item_padding_bottom);
+        mPaddingLeft =
+                resources.getDimensionPixelOffset(R.dimen.list_item_padding_left);
+        mPaddingRight =
+                resources.getDimensionPixelOffset(R.dimen.list_item_padding_right);
+        mGapBetweenImageAndText =
+                resources.getDimensionPixelOffset(R.dimen.list_item_gap_between_image_and_text);
+        mGapBetweenLabelAndData =
+                resources.getDimensionPixelOffset(R.dimen.list_item_gap_between_label_and_data);
+        mCallButtonPadding =
+                resources.getDimensionPixelOffset(R.dimen.list_item_call_button_padding);
+        mPresenceIconMargin =
+                resources.getDimensionPixelOffset(R.dimen.list_item_presence_icon_margin);
+        mHeaderTextWidth =
+                resources.getDimensionPixelOffset(R.dimen.list_item_header_text_width);
+    }
+
+    /**
+     * Installs a call button listener.
+     */
+    public void setOnCallButtonClickListener(OnClickListener callButtonClickListener) {
+        mCallButtonClickListener = callButtonClickListener;
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        // We will match parent's width and wrap content vertically, but make sure
+        // height is no less than listPreferredItemHeight.
+        int width = resolveSize(0, widthMeasureSpec);
+        int height = 0;
+
+        mLine1Height = 0;
+        mLine2Height = 0;
+        mLine3Height = 0;
+
+        // Obtain the natural dimensions of the name text (we only care about height)
+        mNameTextView.measure(0, 0);
+
+        mLine1Height = mNameTextView.getMeasuredHeight();
+
+        if (isVisible(mLabelView)) {
+            mLabelView.measure(0, 0);
+            mLine2Height = mLabelView.getMeasuredHeight();
+        }
+
+        if (isVisible(mDataView)) {
+            mDataView.measure(0, 0);
+            mLine2Height = Math.max(mLine2Height, mDataView.getMeasuredHeight());
+        }
+
+        if (isVisible(mSnippetView)) {
+            mSnippetView.measure(0, 0);
+            mLine3Height = mSnippetView.getMeasuredHeight();
+        }
+
+        height += mLine1Height + mLine2Height + mLine3Height;
+
+        if (isVisible(mCallButton)) {
+            mCallButton.measure(0, 0);
+        }
+        if (isVisible(mPresenceIcon)) {
+            mPresenceIcon.measure(0, 0);
+        }
+
+        ensurePhotoViewSize();
+
+        height = Math.max(height, mPhotoViewHeight);
+        height = Math.max(height, mPreferredHeight);
+
+        if (mHeaderVisible) {
+            ensureHeaderBackground();
+            mHeaderTextView.measure(
+                    MeasureSpec.makeMeasureSpec(mHeaderTextWidth, MeasureSpec.EXACTLY),
+                    MeasureSpec.makeMeasureSpec(mHeaderBackgroundHeight, MeasureSpec.EXACTLY));
+            height += mHeaderBackgroundDrawable.getIntrinsicHeight();
+        }
+
+        setMeasuredDimension(width, height);
+    }
+
+    @Override
+    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+        int height = bottom - top;
+        int width = right - left;
+
+        // Determine the vertical bounds by laying out the header first.
+        int topBound = 0;
+
+        if (mHeaderVisible) {
+            mHeaderBackgroundDrawable.setBounds(
+                    0,
+                    0,
+                    width,
+                    mHeaderBackgroundHeight);
+            mHeaderTextView.layout(0, 0, width, mHeaderBackgroundHeight);
+            topBound += mHeaderBackgroundHeight;
+        }
+
+        // Positions of views on the left are fixed and so are those on the right side.
+        // The stretchable part of the layout is in the middle.  So, we will start off
+        // by laying out the left and right sides. Then we will allocate the remainder
+        // to the text fields in the middle.
+
+        // Left side
+        int leftBound = mPaddingLeft;
+        View photoView = mQuickContact != null ? mQuickContact : mPhotoView;
+        if (photoView != null) {
+            // Center the photo vertically
+            int photoTop = topBound + (height - topBound - mPhotoViewHeight) / 2;
+            photoView.layout(
+                    leftBound,
+                    photoTop,
+                    leftBound + mPhotoViewWidth,
+                    photoTop + mPhotoViewHeight);
+            leftBound += mPhotoViewWidth + mGapBetweenImageAndText;
+        }
+
+        // Right side
+        int rightBound = right;
+        if (isVisible(mCallButton)) {
+            int buttonWidth = mCallButton.getMeasuredWidth();
+            rightBound -= buttonWidth;
+            mCallButton.layout(
+                    rightBound,
+                    topBound,
+                    rightBound + buttonWidth,
+                    height);
+            mVerticalDividerVisible = true;
+            ensureVerticalDivider();
+            rightBound -= mVerticalDividerWidth;
+            mVerticalDividerDrawable.setBounds(
+                    rightBound,
+                    topBound + mVerticalDividerMargin,
+                    rightBound + mVerticalDividerWidth,
+                    height - mVerticalDividerMargin);
+        } else {
+            mVerticalDividerVisible = false;
+        }
+
+        if (isVisible(mPresenceIcon)) {
+            int iconWidth = mPresenceIcon.getMeasuredWidth();
+            rightBound -= mPresenceIconMargin + iconWidth;
+            mPresenceIcon.layout(
+                    rightBound,
+                    topBound,
+                    rightBound + iconWidth,
+                    height);
+        }
+
+        if (mHorizontalDividerVisible) {
+            ensureHorizontalDivider();
+            mHorizontalDividerDrawable.setBounds(
+                    0,
+                    height - mHorizontalDividerHeight,
+                    width,
+                    height);
+        }
+
+        topBound += mPaddingTop;
+        int bottomBound = height - mPaddingBottom;
+
+        // Text lines, centered vertically
+        rightBound -= mPaddingRight;
+
+        // Center text vertically
+        int totalTextHeight = mLine1Height + mLine2Height + mLine3Height;
+        int textTopBound = (bottomBound + topBound - totalTextHeight) / 2;
+
+        mNameTextView.layout(leftBound,
+                textTopBound,
+                rightBound,
+                textTopBound + mLine1Height);
+
+        int dataLeftBound = leftBound;
+        if (isVisible(mLabelView)) {
+            dataLeftBound = leftBound + mLabelView.getMeasuredWidth();
+            mLabelView.layout(leftBound,
+                    textTopBound + mLine1Height,
+                    dataLeftBound,
+                    textTopBound + mLine1Height + mLine2Height);
+            dataLeftBound += mGapBetweenLabelAndData;
+        }
+
+        if (isVisible(mDataView)) {
+            mDataView.layout(dataLeftBound,
+                    textTopBound + mLine1Height,
+                    rightBound,
+                    textTopBound + mLine1Height + mLine2Height);
+        }
+
+        if (isVisible(mSnippetView)) {
+            mSnippetView.layout(leftBound,
+                    textTopBound + mLine1Height + mLine2Height,
+                    rightBound,
+                    textTopBound + mLine1Height + mLine2Height + mLine3Height);
+        }
+    }
+
+    private boolean isVisible(View view) {
+        return view != null && view.getVisibility() == View.VISIBLE;
+    }
+
+    /**
+     * Loads the drawable for the vertical divider if it has not yet been loaded.
+     */
+    private void ensureVerticalDivider() {
+        if (mVerticalDividerDrawable == null) {
+            mVerticalDividerDrawable = mContext.getResources().getDrawable(
+                    R.drawable.divider_vertical_dark);
+            mVerticalDividerWidth = mVerticalDividerDrawable.getIntrinsicWidth();
+        }
+    }
+
+    /**
+     * Loads the drawable for the horizontal divider if it has not yet been loaded.
+     */
+    private void ensureHorizontalDivider() {
+        if (mHorizontalDividerDrawable == null) {
+            mHorizontalDividerDrawable = mContext.getResources().getDrawable(
+                    com.android.internal.R.drawable.divider_horizontal_dark_opaque);
+            mHorizontalDividerHeight = mHorizontalDividerDrawable.getIntrinsicHeight();
+        }
+    }
+
+    /**
+     * Loads the drawable for the header background if it has not yet been loaded.
+     */
+    private void ensureHeaderBackground() {
+        if (mHeaderBackgroundDrawable == null) {
+            mHeaderBackgroundDrawable = mContext.getResources().getDrawable(
+                    android.R.drawable.dark_header);
+            mHeaderBackgroundHeight = mHeaderBackgroundDrawable.getIntrinsicHeight();
+        }
+    }
+
+    /**
+     * Extracts width and height from the style
+     */
+    private void ensurePhotoViewSize() {
+        if (mPhotoViewWidth == 0 && mPhotoViewHeight == 0) {
+            TypedArray a = mContext.obtainStyledAttributes(null,
+                    com.android.internal.R.styleable.ViewGroup_Layout,
+                    QUICK_CONTACT_BADGE_STYLE, 0);
+            mPhotoViewWidth = a.getLayoutDimension(
+                    android.R.styleable.ViewGroup_Layout_layout_width,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+            mPhotoViewHeight = a.getLayoutDimension(
+                    android.R.styleable.ViewGroup_Layout_layout_height,
+                    ViewGroup.LayoutParams.WRAP_CONTENT);
+            a.recycle();
+        }
+    }
+
+    @Override
+    public void dispatchDraw(Canvas canvas) {
+        if (mHeaderVisible) {
+            mHeaderBackgroundDrawable.draw(canvas);
+        }
+        if (mHorizontalDividerVisible) {
+            mHorizontalDividerDrawable.draw(canvas);
+        }
+        if (mVerticalDividerVisible) {
+            mVerticalDividerDrawable.draw(canvas);
+        }
+        super.dispatchDraw(canvas);
+    }
+
+    /**
+     * Sets the flag that determines whether a divider should drawn at the bottom
+     * of the view.
+     */
+    public void setDividerVisible(boolean visible) {
+        mHorizontalDividerVisible = visible;
+    }
+
+    /**
+     * Sets section header or makes it invisible if the title is null.
+     */
+    public void setSectionHeader(String title) {
+        if (!TextUtils.isEmpty(title)) {
+            if (mHeaderTextView == null) {
+                mHeaderTextView = new TextView(mContext);
+                mHeaderTextView.setTypeface(mHeaderTextView.getTypeface(), Typeface.BOLD);
+                mHeaderTextView.setTextColor(mContext.getResources()
+                        .getColor(com.android.internal.R.color.dim_foreground_dark));
+                mHeaderTextView.setTextSize(14);
+                mHeaderTextView.setGravity(Gravity.CENTER);
+                addView(mHeaderTextView);
+            }
+            mHeaderTextView.setText(title);
+            mHeaderTextView.setVisibility(View.VISIBLE);
+            mHeaderVisible = true;
+        } else {
+            if (mHeaderTextView != null) {
+                mHeaderTextView.setVisibility(View.GONE);
+            }
+            mHeaderVisible = false;
+        }
+    }
+
+    /**
+     * Returns the quick contact badge, creating it if necessary.
+     */
+    public QuickContactBadge getQuickContact() {
+        if (mQuickContact == null) {
+            mQuickContact = new QuickContactBadge(mContext, null, QUICK_CONTACT_BADGE_STYLE);
+            mQuickContact.setExcludeMimes(new String[] { Contacts.CONTENT_ITEM_TYPE });
+            addView(mQuickContact);
+        }
+        return mQuickContact;
+    }
+
+    /**
+     * Returns the photo view, creating it if necessary.
+     */
+    public ImageView getPhotoView() {
+        if (mPhotoView == null) {
+            mPhotoView = new ImageView(mContext, null, QUICK_CONTACT_BADGE_STYLE);
+            // Quick contact style used above will set a background - remove it
+            mPhotoView.setBackgroundDrawable(null);
+            addView(mPhotoView);
+        }
+        return mPhotoView;
+    }
+
+    /**
+     * Returns the text view for the contact name, creating it if necessary.
+     */
+    public TextView getNameTextView() {
+        if (mNameTextView == null) {
+            mNameTextView = new TextView(mContext);
+            mNameTextView.setSingleLine(true);
+            mNameTextView.setEllipsize(TruncateAt.MARQUEE);
+            mNameTextView.setTextAppearance(mContext, android.R.style.TextAppearance_Large);
+            mNameTextView.setGravity(Gravity.CENTER_VERTICAL);
+            addView(mNameTextView);
+        }
+        return mNameTextView;
+    }
+
+    /**
+     * Adds a call button using the supplied arguments as an id and tag.
+     */
+    public void showCallButton(int id, int tag) {
+        if (mCallButton == null) {
+            mCallButton = new DontPressWithParentImageView(mContext, null);
+            mCallButton.setId(id);
+            mCallButton.setOnClickListener(mCallButtonClickListener);
+            mCallButton.setBackgroundResource(R.drawable.call_background);
+            mCallButton.setImageResource(android.R.drawable.sym_action_call);
+            mCallButton.setPadding(mCallButtonPadding, 0, mCallButtonPadding, 0);
+            mCallButton.setScaleType(ScaleType.CENTER);
+            addView(mCallButton);
+        }
+
+        mCallButton.setTag(tag);
+        mCallButton.setVisibility(View.VISIBLE);
+    }
+
+    public void hideCallButton() {
+        if (mCallButton != null) {
+            mCallButton.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * Adds or updates a text view for the data label.
+     */
+    public void setLabel(CharSequence text) {
+        if (TextUtils.isEmpty(text)) {
+            if (mLabelView != null) {
+                mLabelView.setVisibility(View.GONE);
+            }
+        } else {
+            getLabelView().setText(text);
+        }
+    }
+
+    /**
+     * Adds or updates a text view for the data label.
+     */
+    public void setLabel(char[] text, int size) {
+        if (text == null || size == 0) {
+            if (mLabelView != null) {
+                mLabelView.setVisibility(View.GONE);
+            }
+        } else {
+            getLabelView().setText(text, 0, size);
+        }
+    }
+
+    /**
+     * Returns the text view for the data label, creating it if necessary.
+     */
+    public TextView getLabelView() {
+        if (mLabelView == null) {
+            mLabelView = new TextView(mContext);
+            mLabelView.setSingleLine(true);
+            mLabelView.setEllipsize(TruncateAt.MARQUEE);
+            mLabelView.setTextAppearance(mContext, android.R.style.TextAppearance_Small);
+            mLabelView.setTypeface(mLabelView.getTypeface(), Typeface.BOLD);
+            addView(mLabelView);
+        }
+        return mLabelView;
+    }
+
+    /**
+     * Adds or updates a text view for the data element.
+     */
+    public void setData(char[] text, int size) {
+        if (text == null || size == 0) {
+            if (mDataView != null) {
+                mDataView.setVisibility(View.GONE);
+            }
+            return;
+        } else {
+            getDataView().setText(text, 0, size);
+        }
+    }
+
+    /**
+     * Returns the text view for the data text, creating it if necessary.
+     */
+    public TextView getDataView() {
+        if (mDataView == null) {
+            mDataView = new TextView(mContext);
+            mDataView.setSingleLine(true);
+            mDataView.setEllipsize(TruncateAt.MARQUEE);
+            mDataView.setTextAppearance(mContext, android.R.style.TextAppearance_Small);
+            addView(mDataView);
+        }
+        return mDataView;
+    }
+
+    /**
+     * Adds or updates a text view for the search snippet.
+     */
+    public void setSnippet(CharSequence text) {
+        if (TextUtils.isEmpty(text)) {
+            if (mSnippetView != null) {
+                mSnippetView.setVisibility(View.GONE);
+            }
+        } else {
+            getSnippetView().setText(text);
+        }
+    }
+
+    /**
+     * Returns the text view for the search snippet, creating it if necessary.
+     */
+    public TextView getSnippetView() {
+        if (mSnippetView == null) {
+            mSnippetView = new TextView(mContext);
+            mSnippetView.setSingleLine(true);
+            mSnippetView.setEllipsize(TruncateAt.MARQUEE);
+            mSnippetView.setTextAppearance(mContext, android.R.style.TextAppearance_Small);
+            mSnippetView.setTypeface(mSnippetView.getTypeface(), Typeface.BOLD);
+            addView(mSnippetView);
+        }
+        return mSnippetView;
+    }
+
+    /**
+     * Adds or updates the presence icon view.
+     */
+    public void setPresence(Drawable icon) {
+        if (icon != null) {
+            if (mPresenceIcon == null) {
+                mPresenceIcon = new ImageView(mContext);
+                addView(mPresenceIcon);
+            }
+            mPresenceIcon.setImageDrawable(icon);
+            mPresenceIcon.setScaleType(ScaleType.CENTER);
+            mPresenceIcon.setVisibility(View.VISIBLE);
+        } else {
+            if (mPresenceIcon != null) {
+                mPresenceIcon.setVisibility(View.GONE);
+            }
+        }
+    }
+}
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index da96e2b..3aa5098 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -112,11 +112,11 @@
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.Button;
+import android.widget.CursorAdapter;
 import android.widget.Filter;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.QuickContactBadge;
-import android.widget.ResourceCursorAdapter;
 import android.widget.SectionIndexer;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -511,10 +511,10 @@
         protected void invalidate() {
             int childCount = mListView.getChildCount();
             for (int i = 0; i < childCount; i++) {
-                View listItem = mListView.getChildAt(i);
-                Object tag = listItem.getTag();
-                if (tag instanceof ContactListItemCache) {
-                    ((ContactListItemCache)tag).nameView.invalidate();
+                View itemView = mListView.getChildAt(i);
+                if (itemView instanceof ContactListItemView) {
+                    final ContactListItemView view = (ContactListItemView)itemView;
+                    view.getNameTextView().invalidate();
                 }
             }
         }
@@ -929,7 +929,8 @@
     public void onClick(View v) {
         int id = v.getId();
         switch (id) {
-            case R.id.call_button: {
+            // TODO a better way of identifying the button
+            case android.R.id.button1: {
                 final int position = (Integer)v.getTag();
                 Cursor c = mAdapter.getCursor();
                 if (c != null) {
@@ -2748,20 +2749,8 @@
     }
 
     final static class ContactListItemCache {
-        public View header;
-        public TextView headerText;
-        public View divider;
-        public TextView nameView;
-        public View callView;
-        public ImageView callButton;
         public CharArrayBuffer nameBuffer = new CharArrayBuffer(128);
-        public TextView labelView;
-        public TextView dataView;
-        public TextView snippetView;
         public CharArrayBuffer dataBuffer = new CharArrayBuffer(128);
-        public ImageView presenceView;
-        public QuickContactBadge photoView;
-        public ImageView nonQuickContactPhotoView;
         public CharArrayBuffer highlightedTextBuffer = new CharArrayBuffer(128);
         public TextWithHighlighting textWithHighlighting;
         public CharArrayBuffer phoneticNameBuffer = new CharArrayBuffer(128);
@@ -2773,7 +2762,7 @@
         public Drawable background;
     }
 
-    private final class ContactItemListAdapter extends ResourceCursorAdapter
+    private final class ContactItemListAdapter extends CursorAdapter
             implements SectionIndexer, OnScrollListener, PinnedHeaderListView.PinnedHeaderAdapter {
         private SectionIndexer mIndexer;
         private boolean mLoading = true;
@@ -2787,7 +2776,7 @@
         private int mSuggestionsCursorCount;
 
         public ContactItemListAdapter(Context context) {
-            super(context, R.layout.contacts_list_item, null, false);
+            super(context, null, false);
 
             mUnknownNameText = context.getText(android.R.string.unknownName);
             switch (mMode) {
@@ -2823,11 +2812,6 @@
 
             if ((mMode & MODE_MASK_SHOW_PHOTOS) == MODE_MASK_SHOW_PHOTOS) {
                 mDisplayPhotos = true;
-                if (mShowSearchSnippets) {
-                    setViewResource(R.layout.contacts_list_item_photo_and_snippet);
-                } else {
-                    setViewResource(R.layout.contacts_list_item_photo);
-                }
             }
         }
 
@@ -2960,10 +2944,13 @@
                 throw new IllegalStateException("couldn't move cursor to position " + position);
             }
 
+            boolean newView;
             View v;
             if (convertView == null || convertView.getTag() == null) {
+                newView = true;
                 v = newView(mContext, cursor, parent);
             } else {
+                newView = false;
                 v = convertView;
             }
             bindView(v, mContext, cursor);
@@ -2971,7 +2958,6 @@
             return v;
         }
 
-
         private View getTotalContactCountView(ViewGroup parent) {
             final LayoutInflater inflater = getLayoutInflater();
             View view = inflater.inflate(R.layout.total_contacts, parent, false);
@@ -3023,39 +3009,17 @@
 
         @Override
         public View newView(Context context, Cursor cursor, ViewGroup parent) {
-            final View view = super.newView(context, cursor, parent);
-
-            final ContactListItemCache cache = new ContactListItemCache();
-            cache.header = view.findViewById(R.id.header);
-            cache.headerText = (TextView)view.findViewById(R.id.header_text);
-            cache.divider = view.findViewById(R.id.list_divider);
-            cache.nameView = (TextView) view.findViewById(R.id.name);
-            cache.callView = view.findViewById(R.id.call_view);
-            cache.callButton = (ImageView) view.findViewById(R.id.call_button);
-            if (cache.callButton != null) {
-                cache.callButton.setOnClickListener(ContactsListActivity.this);
-            }
-            cache.labelView = (TextView) view.findViewById(R.id.label);
-            cache.dataView = (TextView) view.findViewById(R.id.data);
-            cache.presenceView = (ImageView) view.findViewById(R.id.presence);
-            cache.photoView = (QuickContactBadge) view.findViewById(R.id.photo);
-            if (cache.photoView != null) {
-                cache.photoView.setExcludeMimes(new String[] {Contacts.CONTENT_ITEM_TYPE});
-            }
-            cache.nonQuickContactPhotoView = (ImageView) view.findViewById(R.id.noQuickContactPhoto);
-            cache.textWithHighlighting = mHighlightingAnimation.createTextWithHighlighting();
-            cache.snippetView = (TextView)view.findViewById(R.id.snippet);
-
-            view.setTag(cache);
+            final ContactListItemView view = new ContactListItemView(context, null);
+            view.setOnCallButtonClickListener(ContactsListActivity.this);
+            view.setTag(new ContactListItemCache());
             return view;
         }
 
         @Override
-        public void bindView(View view, Context context, Cursor cursor) {
+        public void bindView(View itemView, Context context, Cursor cursor) {
+            final ContactListItemView view = (ContactListItemView)itemView;
             final ContactListItemCache cache = (ContactListItemCache) view.getTag();
 
-            TextView dataView = cache.dataView;
-            TextView labelView = cache.labelView;
             int typeColumnIndex;
             int dataColumnIndex;
             int labelColumnIndex;
@@ -3100,16 +3064,21 @@
 
             // Set the name
             cursor.copyStringToBuffer(nameColumnIndex, cache.nameBuffer);
+            TextView nameView = view.getNameTextView();
             int size = cache.nameBuffer.sizeCopied;
             if (size != 0) {
                 if (highlightingEnabled) {
-                    buildDisplayNameWithHighlighting(cache.nameView, cursor, cache.nameBuffer,
+                    if (cache.textWithHighlighting == null) {
+                        cache.textWithHighlighting =
+                                mHighlightingAnimation.createTextWithHighlighting();
+                    }
+                    buildDisplayNameWithHighlighting(nameView, cursor, cache.nameBuffer,
                             cache.highlightedTextBuffer, cache.textWithHighlighting);
                 } else {
-                    cache.nameView.setText(cache.nameBuffer.data, 0, size);
+                    nameView.setText(cache.nameBuffer.data, 0, size);
                 }
             } else {
-                cache.nameView.setText(mUnknownNameText);
+                nameView.setText(mUnknownNameText);
             }
 
             boolean hasPhone = cursor.getColumnCount() >= SUMMARY_HAS_PHONE_COLUMN_INDEX
@@ -3118,10 +3087,9 @@
             // Make the call button visible if requested.
             if (mDisplayCallButton && hasPhone) {
                 int pos = cursor.getPosition();
-                cache.callView.setVisibility(View.VISIBLE);
-                cache.callButton.setTag(pos);
+                view.showCallButton(android.R.id.button1, pos);
             } else {
-                cache.callView.setVisibility(View.GONE);
+                view.hideCallButton();
             }
 
             // Set the photo, if requested
@@ -3135,25 +3103,20 @@
 
                 ImageView viewToUse;
                 if (useQuickContact) {
-                    viewToUse = cache.photoView;
                     // Build soft lookup reference
                     final long contactId = cursor.getLong(SUMMARY_ID_COLUMN_INDEX);
                     final String lookupKey = cursor.getString(SUMMARY_LOOKUP_KEY_COLUMN_INDEX);
-                    cache.photoView.assignContactUri(Contacts.getLookupUri(contactId, lookupKey));
-                    cache.photoView.setVisibility(View.VISIBLE);
-                    cache.nonQuickContactPhotoView.setVisibility(View.INVISIBLE);
+                    QuickContactBadge quickContact = view.getQuickContact();
+                    quickContact.assignContactUri(Contacts.getLookupUri(contactId, lookupKey));
+                    viewToUse = quickContact;
                 } else {
-                    viewToUse = cache.nonQuickContactPhotoView;
-                    cache.photoView.setVisibility(View.INVISIBLE);
-                    cache.nonQuickContactPhotoView.setVisibility(View.VISIBLE);
+                    viewToUse = view.getPhotoView();
                 }
 
-
                 final int position = cursor.getPosition();
                 mPhotoLoader.loadPhoto(viewToUse, photoId);
             }
 
-            ImageView presenceView = cache.presenceView;
             if ((mMode & MODE_MASK_NO_PRESENCE) == 0) {
                 // Set the proper icon (star or presence or nothing)
                 int serverStatus;
@@ -3161,27 +3124,24 @@
                     serverStatus = cursor.getInt(SUMMARY_PRESENCE_STATUS_COLUMN_INDEX);
                     Drawable icon = ContactPresenceIconUtil.getPresenceIcon(mContext, serverStatus);
                     if (icon != null) {
-                        presenceView.setImageDrawable(icon);
-                        presenceView.setVisibility(View.VISIBLE);
+                        view.setPresence(icon);
                     } else {
-                        presenceView.setVisibility(View.GONE);
+                        view.setPresence(null);
                     }
                 } else {
-                    presenceView.setVisibility(View.GONE);
+                    view.setPresence(null);
                 }
             } else {
-                presenceView.setVisibility(View.GONE);
+                view.setPresence(null);
             }
 
-            // TODO: make sure that when mShowSearchSnippets is true, the
-            // snippet views are available
-            if (mShowSearchSnippets && cache.snippetView != null) {
+            if (mShowSearchSnippets) {
                 boolean showSnippet = false;
                 String snippetMimeType = cursor.getString(SUMMARY_SNIPPET_MIMETYPE_COLUMN_INDEX);
                 if (Email.CONTENT_ITEM_TYPE.equals(snippetMimeType)) {
                     String email = cursor.getString(SUMMARY_SNIPPET_DATA1_COLUMN_INDEX);
                     if (!TextUtils.isEmpty(email)) {
-                        cache.snippetView.setText(email);
+                        view.setSnippet(email);
                         showSnippet = true;
                     }
                 } else if (Organization.CONTENT_ITEM_TYPE.equals(snippetMimeType)) {
@@ -3189,42 +3149,41 @@
                     String title = cursor.getString(SUMMARY_SNIPPET_DATA4_COLUMN_INDEX);
                     if (!TextUtils.isEmpty(company)) {
                         if (!TextUtils.isEmpty(title)) {
-                            cache.snippetView.setText(company + " / " + title);
+                            view.setSnippet(company + " / " + title);
                         } else {
-                            cache.snippetView.setText(company);
+                            view.setSnippet(company);
                         }
                         showSnippet = true;
                     } else if (!TextUtils.isEmpty(title)) {
-                        cache.snippetView.setText(title);
+                        view.setSnippet(title);
                         showSnippet = true;
                     }
                 } else if (Nickname.CONTENT_ITEM_TYPE.equals(snippetMimeType)) {
                     String nickname = cursor.getString(SUMMARY_SNIPPET_DATA1_COLUMN_INDEX);
                     if (!TextUtils.isEmpty(nickname)) {
-                        cache.snippetView.setText(nickname);
+                        view.setSnippet(nickname);
                         showSnippet = true;
                     }
                 }
 
-                cache.snippetView.setVisibility(showSnippet ? View.VISIBLE : View.GONE);
+                if (!showSnippet) {
+                    view.setSnippet(null);
+                }
             }
 
             if (!displayAdditionalData) {
-                cache.dataView.setVisibility(View.GONE);
-
                 if (phoneticNameColumnIndex != -1) {
 
                     // Set the name
                     cursor.copyStringToBuffer(phoneticNameColumnIndex, cache.phoneticNameBuffer);
                     int phoneticNameSize = cache.phoneticNameBuffer.sizeCopied;
                     if (phoneticNameSize != 0) {
-                        cache.labelView.setText(cache.phoneticNameBuffer.data, 0, phoneticNameSize);
-                        cache.labelView.setVisibility(View.VISIBLE);
+                        view.setLabel(cache.phoneticNameBuffer.data, phoneticNameSize);
                     } else {
-                        cache.labelView.setVisibility(View.GONE);
+                        view.setLabel(null);
                     }
                 } else {
-                    cache.labelView.setVisibility(View.GONE);
+                    view.setLabel(null);
                 }
                 return;
             }
@@ -3233,29 +3192,23 @@
             cursor.copyStringToBuffer(dataColumnIndex, cache.dataBuffer);
 
             size = cache.dataBuffer.sizeCopied;
-            if (size != 0) {
-                dataView.setText(cache.dataBuffer.data, 0, size);
-                dataView.setVisibility(View.VISIBLE);
-            } else {
-                dataView.setVisibility(View.GONE);
-            }
+            view.setData(cache.dataBuffer.data, size);
 
             // Set the label.
             if (!cursor.isNull(typeColumnIndex)) {
-                labelView.setVisibility(View.VISIBLE);
-
                 final int type = cursor.getInt(typeColumnIndex);
                 final String label = cursor.getString(labelColumnIndex);
 
                 if (mMode == MODE_LEGACY_PICK_POSTAL || mMode == MODE_PICK_POSTAL) {
-                    labelView.setText(StructuredPostal.getTypeLabel(context.getResources(), type,
+                    // TODO cache
+                    view.setLabel(StructuredPostal.getTypeLabel(context.getResources(), type,
                             label));
                 } else {
-                    labelView.setText(Phone.getTypeLabel(context.getResources(), type, label));
+                    // TODO cache
+                    view.setLabel(Phone.getTypeLabel(context.getResources(), type, label));
                 }
             } else {
-                // There is no label, hide the the view
-                labelView.setVisibility(View.GONE);
+                view.setLabel(null);
             }
         }
 
@@ -3278,30 +3231,27 @@
             textView.setText(textWithHighlighting);
         }
 
-        private void bindSectionHeader(View view, int position, boolean displaySectionHeaders) {
+        private void bindSectionHeader(View itemView, int position, boolean displaySectionHeaders) {
+            final ContactListItemView view = (ContactListItemView)itemView;
             final ContactListItemCache cache = (ContactListItemCache) view.getTag();
             if (!displaySectionHeaders) {
-                cache.header.setVisibility(View.GONE);
-                cache.divider.setVisibility(View.VISIBLE);
+                view.setSectionHeader(null);
+                view.setDividerVisible(true);
             } else {
                 final int section = getSectionForPosition(position);
                 if (getPositionForSection(section) == position) {
                     String title = (String)mIndexer.getSections()[section];
-                    if (!TextUtils.isEmpty(title)) {
-                        cache.headerText.setText(title);
-                        cache.header.setVisibility(View.VISIBLE);
-                    } else {
-                        cache.header.setVisibility(View.GONE);
-                    }
+                    view.setSectionHeader(title);
                 } else {
-                    cache.header.setVisibility(View.GONE);
+                    view.setDividerVisible(false);
+                    view.setSectionHeader(null);
                 }
 
                 // move the divider for the last item in a section
                 if (getPositionForSection(section + 1) - 1 == position) {
-                    cache.divider.setVisibility(View.GONE);
+                    view.setDividerVisible(false);
                 } else {
-                    cache.divider.setVisibility(View.VISIBLE);
+                    view.setDividerVisible(true);
                 }
             }
         }
