Search code examples
androidperformancelistviewcursorandroid-cursoradapter

ListView performance lower on 4.2 than on 4.1


I have just upgraded on Android 4.2 on my Galaxy Nexus and ListView seems to be slower than It used to be on 4.1. This bindView method was perfect fast on 4.1, on new 4.2 I see small glitches. I have tried to explicitly enable hardware acceleration in AndroidManifest.xml, but it dit not help much. People (Contacts) app works perfect on 4.2, which I guess is also implemented by extended android.support.v4.widget.CursorAdapter. I have also already tried to change android.support.v4.widget.CursorAdapter for android.widget.CursorAdapter without visible improvement.

@Override
public void bindView(View view, Context context, Cursor cursor) {
    final ViewHolder holder = (ViewHolder) view.getTag();
    holder.nameView.setText(cursor.getString(mStreetColumnIndex));
    holder.townView.setText(cursor.getString(mTownColumnIndex));
    if (mDistanceColumn != null) {
        float distance = cursor.getFloat(mDistanceColumn);
        String distanceUnit;
        if (distance >= 1000) {
            distance /= 1000;
            distanceUnit = " km";
        } else {
            distanceUnit = " m";
        }
        String decimalString = mDecimalFormat.format(distance);
        holder.distanceView.setText(decimalString + distanceUnit);
        holder.distanceView.setVisibility(View.VISIBLE);
    } else {
        holder.distanceView.setVisibility(View.GONE);
    }

    // read only brand first letter to be faster
    cursor.copyStringToBuffer(mBrandColumnIndex, mBuffer);
    if (mBuffer.sizeCopied > 0) {
        if (mBuffer.data[0] == 'a') {
            holder.logoImgView.setImageResource(R.drawable.agip);
        } else {
            holder.logoImgView.setImageResource(R.drawable.papoil);
        }
    } else {
        holder.logoImgView.setVisibility(View.INVISIBLE);
    }
}

EDIT: added row layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="@dimen/row_height"
            android:background="@drawable/bg_list_selector"
            android:layout_marginRight="@dimen/screen_padding"
            android:layout_marginLeft="@dimen/screen_padding"
            android:paddingLeft="@dimen/screen_padding">
<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_marginRight="@dimen/screen_padding"
        android:layout_toLeftOf="@+id/txtDistance"
        android:orientation="vertical"
        >
    <TextView
            android:id="@+id/txtName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/list_text_primary_size"
            android:textStyle="bold"
            />
    <TextView
            android:id="@+id/txtTown"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/list_text_primary_size"
            />
</LinearLayout>
<TextView
        android:id="@+id/txtDistance"
        android:layout_toLeftOf="@+id/imgLogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textColor="@color/grey_dark"
        android:textSize="13sp"
        android:textStyle="bold"
        android:layout_marginRight="@dimen/screen_padding"/>
<ImageView
        android:id="@+id/imgLogo"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/agip"
        android:background="@color/grey_dark"
        />
</RelativeLayout>

EDIT 2: here is traceview http://goo.gl/UmS3w which was made using http://goo.gl/Yoe1u


Solution

  • It was caused by too much complicated windowBackground, which was:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_repeat">
    </item>
    <item>
        <shape>
            <gradient android:startColor="#0affffff" android:endColor="#0a000000"
                      android:type="radial" android:gradientRadius="500"/>
        </shape>
    </item>
    <item>
        <shape>
            <gradient android:startColor="#1effffff" android:endColor="#1e000000"
                      android:type="linear" android:angle="270"/>
        </shape>
    </item>
    </layer-list>
    

    and bg_repeat.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/bg"
        android:tileMode="repeat"/>
    

    Thanks all for help!