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
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!