Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

getLoaderManager().initLoader() doesn't accept 'this' as argument though the class (ListFragment) implements LoaderManager.LoaderCallbacks<Cursor>

I'm having trouble following a guide on using SQLite in Android. I'm using a ListFragment instead of a ListActivity(as in the example), so I have the ListFragment implement LoaderManager.LoaderCallbacks<Cursor> instead. Then, in the fillData() method in the ListFragment:

private void fillData() {     // Fields from the database (projection)     // Must include the _id column for the adapter to work     String[] from = new String[] { NotesSQLiteHelper.COLUMN_TITLE };     // Fields on the UI to which we map     int[] to = new int[] { R.id.label };      getLoaderManager().initLoader(0, null, this); //error     adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.notes_row, null, from, to, 0);     setListAdapter(adapter); } 

I get the error:

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, NotesActivity.ArrayListFragment) 

on the marked line even though this implements LoaderManager.LoaderCallbacks<Cursor>.

Thank you for any ideas.

like image 778
vurp0 Avatar asked Jun 22 '12 12:06

vurp0


2 Answers

You are not using the right implementations of CursorLoader and Loader. Remove your old imports and use these ones:

import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; 

But I have the same Problem using SherlockActionBar: As I have to extend SherlockListActivity there is NO method getSupportLoadManager().

Any ideas on this?

EDIT: follow this tutorial if you do not know how to use fragments. Create a new Class with extends SherlockFragment and move your display logic there. Make your old activity extend SherlockFragmentActivity and show the newly created SherlockFragment. This way I got it working. Thanks to @JakeWharton!

like image 188
Matthias B Avatar answered Oct 02 '22 09:10

Matthias B


A few things to watch out for (from my recent experience battling with this):

  1. If your minSDK is set to less than 11 (i.e. level 10 for Gingerbread) and you are using the Support Pack for backward compatibility, make sure you use

    getSupportLoaderManager().initLoader(LOADER_ID, null, this); 
  2. You mentioned this when you said you are using ListFragment, but it bears repeating: Do not extend Activity, otherwise the support package will not work. Instead, extend the FragmentActivity class or the ListFragment class.

  3. For your imports, make sure you are using the correct versions if your minSDK < 11:

     android.support.v4.app.FragmentActivity;  android.support.v4.app.LoaderManager;  android.support.v4.content.Loader; 

Hope this helps you... or at least someone else...

like image 23
wileyCoyote Avatar answered Oct 02 '22 07:10

wileyCoyote