【发布时间】:2012-11-02 08:52:29
【问题描述】:
我刚刚在 Galaxy Nexus 上升级了 Android 4.2,ListView 似乎比以前在 4.1 上的要慢。这种 bindView 方法在 4.1 上非常快速,在新的 4.2 上我看到了小故障。我曾尝试在AndroidManifest.xml 中显式启用硬件加速,但这并没有多大帮助。人(联系人)应用程序在 4.2 上完美运行,我猜这也是由扩展 android.support.v4.widget.CursorAdapter 实现的。我也已经尝试将android.support.v4.widget.CursorAdapter 更改为android.widget.CursorAdapter,但没有明显改善。
@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);
}
}
编辑:添加行布局
<?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>
编辑 2: 这是跟踪视图http://goo.gl/UmS3w 这是使用http://goo.gl/Yoe1u制作的
【问题讨论】:
-
我已经添加了行布局。
-
你的文本视图下有一行吗?
-
是的,使用
<item name="android:divider">@drawable/abs__list_divider_holo_light</item>定义 -
不,我的意思是 textviews 正下方的一行,我在 4.2 中遇到了这个问题,在我的 textviews 中启用了某种拼写检查,我只是将它添加到每个 textview 并且列表视图再次快速。 android:inputType="textNoSuggestions"
-
您应该知道,由于您使用的是
CursorAdapter,因此您对Views进行膨胀的newView()方法已经在其源代码中实现了某种ViewHolder模式。您无需添加自己的ViewHolder。
标签: android performance listview cursor android-cursoradapter