getLoaderManager().initLoader() akzeptiert „this“ nicht als Argument, obwohl die Klasse (ListFragment) LoaderManager.LoaderCallbacks implementiert

Lesezeit: 5 Minuten

Benutzer-Avatar
vurp0

Ich habe Probleme, a zu folgen führen zur Verwendung von SQLite in Android. Ich benutze eine ListFragment anstelle einer ListActivity(wie im Beispiel), also habe ich die ListFragment implementieren LoaderManager.LoaderCallbacks<Cursor> stattdessen. Dann im fillData() Methode in der 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);
}

Ich bekomme den Fehler:

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

auf der markierten Linie, obwohl this implementiert LoaderManager.LoaderCallbacks<Cursor>.

Vielen Dank für Ideen.

  • pastebin.com/284e26tT filldata() steht am Ende der Datei. Ich habe den Paketnamen geändert. Ich hätte wahrscheinlich auch erwähnen sollen, dass ich ActionBarSherlock verwende.

    – vurp0

    22. Juni 2012 um 12:50 Uhr


Benutzer-Avatar
Mathias B

Sie verwenden nicht die richtigen Implementierungen von CursorLoader und Loader. Entfernen Sie Ihre alten Importe und verwenden Sie diese:

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

Aber ich habe das gleiche Problem mit SherlockActionBar: Da muss ich verlängern SherlockListActivity es gibt KEINE Methode getSupportLoadManager().

Irgendwelche Ideen dazu?

EDIT: folgen dieses Tutorial wenn Sie nicht wissen, wie man Fragmente verwendet. Erstellen Sie eine neue Klasse mit SherlockFragment und verschieben Sie Ihre Anzeigelogik dorthin. Lassen Sie Ihre alte Aktivität SherlockFragmentActivity erweitern und zeigen Sie das neu erstellte SherlockFragment an. Auf diese Weise habe ich es zum Laufen gebracht. Danke an @JakeWharton!

  • SherlockListActivity erweitert ListActivity. Unterstützungsfragmente und Ladeprogramme sind Teil der Unterstützungsbibliothek, was bedeutet, dass Sie sie erweitern müssen FragmentActivity (oder SherlockFragmentActivity).

    – Jake Wharton

    11. Juli 2012 um 19:18 Uhr

  • Völlig vergessen, dass ich hier eine offene Frage hatte, aber das war das Problem! Vielen Dank!

    – vurp0

    12. Juli 2012 um 18:56 Uhr

  • @tasomanisch Nr. ListActivity stellt nur ein oder zwei Helfer rund um den Einsatz bereit ListView. Sie können eine normale verwenden SherlockFragmentActivity und erstellen Sie einfach eine ListView dich selbst.

    – Jake Wharton

    15. Januar 2013 um 23:42 Uhr

  • setContentView(android.R.layout.list_content) und Sie haben auf magische Weise dasselbe!

    – Jake Wharton

    16. Januar 2013 um 21:08 Uhr

  • @JakeWharton seit welcher Version existiert das list_content Layout? Oder ist dies das Standard-ListActivity-Layout? Wenn ich es zu meiner ListActivity hinzufüge, erhalte ich eine Fehlermeldung, list_content kann nicht gelöst werden. Zielversion 16, Mindestversion 8.

    – Mathias B

    17. Januar 2013 um 9:35 Uhr


Benutzer-Avatar
wileyCoyote

Ein paar Dinge, auf die Sie achten sollten (aus meiner jüngsten Erfahrung im Kampf damit):

  1. Wenn Ihr minSDK auf weniger als 11 eingestellt ist (dh Level 10 für Gingerbread) und Sie das Support Pack für die Abwärtskompatibilität verwenden, stellen Sie sicher, dass Sie es verwenden

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
  2. Sie haben dies erwähnt, als Sie sagten, dass Sie ListFragment verwenden, aber es muss wiederholt werden: Erweitern Sie Activity nicht, sonst funktioniert das Support-Paket nicht. Erweitern Sie stattdessen die FragmentActivity-Klasse oder die ListFragment-Klasse.

  3. Stellen Sie für Ihre Importe sicher, dass Sie die richtigen Versionen verwenden, wenn Ihr minSDK < 11 ist:

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

Hoffe, das hilft dir … oder zumindest jemand anderem …

  • Ich habe die Unterstützungsbibliothek v4 hinzugefügt, aber leider bekomme ich den getSupprtLoaderManager immer noch nicht, ich musste die actionbarsherlock-Bibliothek hinzufügen und die SherlockFragmentActivity erweitern

    – Rat-a-tat-a-tat Ratatouille

    6. Oktober 2013 um 15:59 Uhr

  • erweitere ich die Klasse mit ACTVITY, dann wird es falsch sein, weil ich auch das gleiche Problem habe, wenn ich den Loader einleite

    – Ähm

    22. Januar 2014 um 11:12 Uhr

Das Casting des dritten Arguments löste das Problem in meinem Fall:

aus

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

zu

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

Notiz:

  1. minSdk war 8 und ich verwendete die Support-Bibliothek v4.
  2. (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)

    funktioniert nicht.

  3. getSupportLoaderManager() or getSupportLoadManager()

    funktioniert nicht.

  4. Dieser Code war innerhalb der Aktivität, nicht im Fragment

  • Dies löst eine RuntimeException für mich aus und ich sehe nicht, wie es jemals funktionieren könnte, es sei denn, es wird einfach nie ausgeführt.

    – Chowey

    21. Februar 2018 um 5:26 Uhr

  • @chowey, was hat Sie zu dem Schluss gebracht, dass die Ausnahme aus diesem Codestück stammt? Viele Entwickler einschließlich mir haben es erfolgreich ausgeführt. Haben Sie auch die lib- und sdk-Version usw. überprüft?

    – Dexter

    21. Februar 2018 um 19:18 Uhr


  • Ich habe den Code ausgeführt, und er ist abgestürzt, und der Stacktrace kehrte zu dieser Codezeile zurück.

    – Chowey

    21. Februar 2018 um 19:22 Uhr

  • Und es hat bei mir funktioniert 🙂 Hast du auch andere Details überprüft, die ich im Kommentar erwähnt hatte? Es ist in Ordnung, dass der Stacktrace zu dieser Codezeile zurückgekehrt ist. Aber was hat es gesagt? Könntest du das auch teilen?

    – Dexter

    22. Februar 2018 um 7:23 Uhr


  • Mein minSdk ist 27 und wenn ich dies tue, erhalte ich die Fehlermeldung: „cannot be cast to android.app.LoaderManager$LoaderCallbacks“

    – sie

    27. September 2018 um 12:11 Uhr

Es ist spät, aber vielleicht hilft jemandem.
wenn Sie den Loader-Manager im Fragment verwenden und Ihre min-API unter HONEYCOMB liegt
Sie sollten diese Importe verwenden

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

und zum Initiieren des Ladeprogramms verwenden Sie diesen Code

getActivity().getSupportLoaderManager().initLoader(/loader stuff*/);

hoffe das hilft jemandem.

Benutzer-Avatar
anandbibek

Ändern Sie Ihre Importe in

import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;

und verwenden

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

Benutzer-Avatar
Doilio Matsinhe

Das hast du:

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

Das sollten Sie haben:

LoaderManager.getInstance(this).initLoader(0, null, this);

Grund für das erste nicht funktioniert:

/**
 * @deprecated Use
 * {@link LoaderManager#getInstance(LifecycleOwner) LoaderManager.getInstance(this)}.
 */

Benutzer-Avatar
Renan Franca

Mein Fehler war, weil dies:

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

1225500cookie-checkgetLoaderManager().initLoader() akzeptiert „this“ nicht als Argument, obwohl die Klasse (ListFragment) LoaderManager.LoaderCallbacks implementiert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy