66 votes

getLoaderManager().initLoader() n'accepte pas 'this' comme argument bien que la classe (ListFragment) implémente LoaderManager.LoaderCallbacks<Cursor>.

J'ai du mal à suivre un guide sur l'utilisation de SQLite dans Android. J'utilise un ListFragment au lieu d'un ListActivity (comme dans l'exemple), j'ai donc l'option ListFragment mettre en œuvre LoaderManager.LoaderCallbacks<Cursor> à la place. Ensuite, dans le fillData() dans le 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);
}

Je reçois l'erreur :

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

sur la ligne marquée, même si this met en œuvre LoaderManager.LoaderCallbacks<Cursor> .

Merci pour toute idée.

0 votes

pastebin.com/284e26tT filldata() est à la fin du fichier. J'ai changé le nom du paquet. J'aurais également dû mentionner que j'utilise ActionBarSherlock.

84voto

elton Points 1706

Vous n'utilisez pas les bonnes implémentations de CursorLoader y Loader . Retirez vos anciennes importations et utilisez celles-ci :

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

Mais j'ai le même problème en utilisant SherlockActionBar : Comme je dois étendre SherlockListActivity il n'y a pas de méthode getSupportLoadManager() .

Des idées à ce sujet ?

EDIT : suivre ce tutoriel si vous ne savez pas comment utiliser les fragments. Créez une nouvelle classe avec extends SherlockFragment et déplacez-y votre logique d'affichage. Faites en sorte que votre ancienne activité étende SherlockFragmentActivity et affiche le SherlockFragment nouvellement créé. De cette façon, j'ai réussi à le faire fonctionner. Merci à @JakeWharton !

15 votes

SherlockListActivity étend ListActivity . Les fragments de support et les chargeurs font partie de la bibliothèque de support. FragmentActivity (ou SherlockFragmentActivity ).

0 votes

J'avais complètement oublié que j'avais une question ouverte ici, mais c'était le problème ! Merci !

0 votes

@tasomaniac Non. ListActivity ne fournit qu'une ou deux aides autour de l'utilisation de ListView . Vous pouvez utiliser un SherlockFragmentActivity et créer simplement un ListView vous-même.

59voto

wileyCoyote Points 309

Voici quelques points à surveiller (d'après mon expérience récente en la matière) :

  1. Si votre minSDK a une valeur inférieure à 11 (c'est-à-dire le niveau 10 pour Gingerbread) et que vous utilisez le Support Pack pour la rétrocompatibilité, assurez-vous que vous utilisez

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
  2. Vous l'avez mentionné lorsque vous avez dit que vous utilisiez ListFragment, mais cela mérite d'être répété : N'étendez pas Activity, sinon le package de support ne fonctionnera pas. Au lieu de cela, étendez la classe FragmentActivity ou la classe ListFragment.

  3. Pour vos importations, assurez-vous que vous utilisez les bonnes versions si votre minSDK < 11 :

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

J'espère que cela vous aidera... ou au moins quelqu'un d'autre...

0 votes

J'ai ajouté la bibliothèque support v4 mais malheureusement je n'ai toujours pas obtenu le getSupprtLoaderManager, j'ai dû ajouter la bibliothèque actionbarsherlock et étendre l'activité SherlockFragmentActivity.

0 votes

Si j'étend la classe avec ACTVITY, alors est-ce que ce sera mauvais parce que j'ai aussi le même problème quand je lance le chargeur.

10voto

Dexter Points 150

Le fait de lancer le troisième argument a résolu le problème dans mon cas :

de

 getLoaderManager().initLoader(0, null, this);

à

 getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this);

Note :

  1. minSdk était 8 et j'utilisais la bibliothèque de support v4.
  2. (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this) n'a pas fonctionné.
  3. getSupportLoaderManager() or getSupportLoadManager() n'a pas fonctionné.
  4. Ce code était dans l'activité et non dans le fragment

2 votes

Cela provoque une RuntimeException et je ne vois pas comment cela pourrait fonctionner, à moins que cela ne soit jamais exécuté.

0 votes

@chowey, qu'est-ce qui vous a fait conclure que l'exception provenait de ce morceau de code ? De nombreux développeurs, dont moi, l'ont exécuté avec succès. Avez-vous vérifié la version de la librairie et du kit de développement, etc. ?

0 votes

J'ai exécuté le code, il a planté, et la trace de la pile est revenue à cette ligne de code.

2voto

Renan Franca Points 378

Mon erreur était due à ceci :

//import android.app.ListFragment; Error when doesnt import from support.v4
import android.support.v4.app.ListFragment;

1voto

brentil Points 51

J'utilise ActionBarSherlock dans mon application et j'ai également rencontré ce problème. J'ai suivi toutes les étapes décrites par d'autres dans cette question. Cependant, je continuais à avoir le même problème après avoir essayé toutes les résolutions suggérées.

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

Le problème était que je m'attendais à ce qu'Eclipse me dise quand il me manquait quelque chose et il me le disait, mais pas de la manière à laquelle j'étais habitué. Typiquement, Eclipse me dirait dans d'autres cas qu'il me manque les overrides pour que quelque chose fonctionne, mais il ne le dit pas directement ici. J'ai finalement compris que "LoaderManager.LoaderCallbacks" était le problème et j'ai réalisé que je n'avais pas de callbacks pour cela, donc cette erreur était en fait une erreur très valide. L'ajout des surcharges de base a résolu mon problème et m'a permis d'avancer.

// Creates a new loader after the initLoader () call
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  // do work
  return null;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
  adapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
  // data is not available anymore, delete reference
  adapter.swapCursor(null);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X