そのため、ListView が携帯電話で途切れていたので、TraceView を使用して原因を特定しました。
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = inflater.inflate(R.layout.menu_row, parent, false);
ViewHolder holder = new ViewHolder();
// setting other Views.
holder.icon = (ImageView) view.findViewById(R.id.icon);
view.setTag(holder);
return view;
}
@Override
public void bindView(View v, Context context, Cursor c) {
ViewHolder holder = (ViewHolder) v.getTag();
// getting other Views
String imgUrl = c.getString(6);
int resource = getResources().getIdentifier(imgUrl, "drawable", getActivity().getPackageName());
if (resource != 0) {
holder.icon.setImageResource(resource);
return;
}
}
予想通り、すべてのメソッド呼び出しで newView と bindView に最も時間がかかっていました。
- newView() はすべての時間を inflater.inflate(R.layout.menu_row, parent, false); で費やしています。電話
- bindView() は、すべての時間を holder.icon.setImageResource(resource); で費やしています。
setImageResource をさらに掘り下げたところ、呼び出し階層は次のようになりました: (これらのメソッドはすべて CPU 時間の 99% でした):
- ImageView.setImageResource
- ImageView.resolveUri
- Resources.getDrawable
- Resources.loadDrawable
- Drawable.createFromResourceStream
- BitmapFactory.decodeResourceStream
- BitmapFactory.decodeStream
- BitmapFactory.nativeDecodeAsset (これは、自身が最も多くの CPU 時間を引き起こしているメソッドです)。
ListView を最適化するにはどうすればよいですか? (すべての画像のディスク サイズは 15 KB 以下です)。
これは私がxmlを設定しているImageViewです:
<ImageView
android:id="@+id/icon"
android:layout_width="0dp"
android:layout_height="85dp"
android:layout_gravity="center_vertical"
android:layout_marginRight="10dp"
android:layout_weight="25"
android:adjustViewBounds="true"
android:contentDescription="@string/description_item"
android:minHeight="85dp"
android:minWidth="85dp"
android:scaleType="fitCenter"
/>
編集: ImageView xml を次のように変更しました。
<ImageView
android:id="@+id/icon"
android:layout_width="85dp"
android:layout_height="85dp"
android:scaleType="center"
android:contentDescription="@string/description_item"
/>
パフォーマンスの向上はありませんでした。