So my ListView was stuttering on my phone, so I used TraceView to determine the culprit.
@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;
}
}
As expected newView and bindView were taking the most time from all of my method calls.
- newView() is spending all of it's time in the inflater.inflate(R.layout.menu_row, parent, false); call
- bindView() is spending all of it's time in holder.icon.setImageResource(resource);
I've dug deeper into setImageResource and the call hierarchy was this: (all of these methods were 99% of the cpu time):
- ImageView.setImageResource
- ImageView.resolveUri
- Resources.getDrawable
- Resources.loadDrawable
- Drawable.createFromResourceStream
- BitmapFactory.decodeResourceStream
- BitmapFactory.decodeStream
- BitmapFactory.nativeDecodeAsset (which is the method whose self is causing the most cpu time).
What can I do to optimize my ListView? (all of my images are not more than 15 KB in disk size).
This is the ImageView I'm setting xml:
<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"
/>
EDIT: I've changed the ImageView xml to:
<ImageView
android:id="@+id/icon"
android:layout_width="85dp"
android:layout_height="85dp"
android:scaleType="center"
android:contentDescription="@string/description_item"
/>
Didn't provide any performance gain.