While doing my "pet" project I noticed that now I have a lot of data and its loading takes some time especially for the first start of app when db is also initialized. I do not want to get "ANR" in my app, so I started looking for the solution.
So I had an activity - child of ListActivity on which I show result. Code looks like as shown below:
public class MainActivity extends ListActivity { private final Uri VOCABULARY_URI = Uri.EMPTY; //Only for example you need added real Uri to your data private final String[] COUNM_NAMES = new String[] { "native_word", "translation_word" }; private final int[] VIEW_IDS = new int[] { R.id.native_word, R.id.translated_word }; private final String[] PROJECTION = new String[] { "_id", "native_word", "translation_word" }; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); Cursor cursor = getContentResolver().query(VOCABULARY_URI, PROJECTION, null, null, null); //The most expensive operation SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.two_item_in_line, cursor, COUNM_NAMES, VIEW_IDS); setListAdapter(adapter); } }
CursorLoader was added in API level 11, but if your app supported a lower api level it is not a problem as you could use Support Library. This library provides backward-compatible features like Fragment which were added in last revisions.
onCreateLoader(int id, Bundle args) - instantiate and return a new Loader for given id
onLoadFinished(Loader<Cursor> loader, Cursor cursor) - called when a previously created loader has finished its load
onLoaderReset(Loader<Cursor>) - called when a previously created loader is being reset, and thus its data unavailable.
And following is my realization:
@Override public Loader<Cursor>onCreateLoader(final int loaderId, final Bundle bundle) { switch (loaderId) { case VOCABLUARY_LOADER_ID: return new CursorLoader(getActivity(), VOCABULARY_URI, PROJECTION, null, null, null); default: return null; } } @Override public void onLoadFinished(final Loader<Cursor> cursorLoader, final Cursor cursor) { adapter.changeCursor(cursor); } @Override public void onLoaderReset(final Loader<Cursor> cursorLoader) { adapter.changeCursor(null); }
That`s all, nice work :-)