I have a list view which display in each view a Album's name, the associated Artist and the album art. Here is the code of my `ListFragment` which display this list: public class AlbumsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { AlbumsAdapter mAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View myFragmentView = inflater.inflate(R.layout.albums_fragment_layout, container, false); return myFragmentView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new AlbumsAdapter(getActivity(), null); setListAdapter(mAdapter); getLoaderManager().initLoader(0, null, this); } static final String[] ALBUM_SUMMARY_PROJECTION = { MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ARTIST, MediaStore.Audio.Albums.ALBUM_ART,}; public Loader<Cursor> onCreateLoader(int id, Bundle args) { String select = null; return new CursorLoader(getActivity(), MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,ALBUM_SUMMARY_PROJECTION, select, null, null); } public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.swapCursor(data); } public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } } Here is my custom `CursorAdapter`'s code: public class AlbumsAdapter extends CursorAdapter { private final LayoutInflater mInflater; public AlbumsAdapter(Context context, Cursor c) { super(context, c); mInflater=LayoutInflater.from(context); } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); if (holder == null) { holder = new ViewHolder(); holder.albumTitle = (TextView) view.findViewById(R.id.albumTextView); holder.artistName = (TextView) view.findViewById(R.id.artistTextView); holder.coverAlbum = (ImageView)view.findViewById(R.id.album_cover); holder.column1 = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM); holder.column2 = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ARTIST); holder.column3 = cursor.getColumnIndexOrThrow(MediaStore.Audio.Albums.ALBUM_ART); view.setTag(holder); } holder.albumTitle.setText(cursor.getString(holder.column1)); holder.artistName.setText(cursor.getString(holder.column2)); Bitmap coverBitmap = BitmapFactory.decodeFile(cursor.getString(holder.column3)); holder.coverAlbum.setImageBitmap(coverBitmap); } static class ViewHolder { TextView albumTitle; TextView artistName; ImageView coverAlbum; int column1; int column2; int column3; } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { final View view=mInflater.inflate(R.layout.albums_row,parent,false); return view; } } As you can see, I use already the trick of the `ViewHolder` to avoid calling `findViewById` too often. But the problem is that my list is still very slow. What can I do to optimize it even more? For instance I could load in priority the Albums' title and Artists' names and display them and then, load in a second time the cover (asynchronously). I've also tried to scale down the resolution of the Cover's Bitmap before displaying them in the `ImageViews`, but I saw no improvement :/ Do you have any idea how to make this list less laggy? Any advice is welcome.