oncreateloader loaders cursorloader android sqlite android-loadermanager android-listfragment

android - loaders - getLoaderManager(). initLoader() no acepta ''esto'' como argumento aunque la clase(ListFragment) implementa LoaderManager.LoaderCallbacks<Cursor>



loaders en android (12)

Algunas cosas de las que hay que estar pendiente (de mi experiencia reciente al luchar con esto):

  1. Si su minSDK está configurado a menos de 11 (es decir, nivel 10 para Gingerbread) y está utilizando el Support Pack para compatibilidad con versiones anteriores, asegúrese de utilizar

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

  2. Usted mencionó esto cuando dijo que está usando ListFragment, pero vale la pena repetirlo: no extienda la actividad, de lo contrario, el paquete de soporte no funcionará. En su lugar, amplíe la clase FragmentActivity o la clase ListFragment.

  3. Para sus importaciones, asegúrese de estar utilizando las versiones correctas si su minSDK <11:

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

Espero que esto te ayude ... o al menos a alguien más ...

Tengo problemas para seguir una guide sobre el uso de SQLite en Android. Estoy usando un ListFragment lugar de una ListActivity (como en el ejemplo), así que tengo el ListFragment implementar LoaderManager.LoaderCallbacks<Cursor> lugar. Luego, en el método fillData() en el 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); }

Me sale el error:

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

en la línea marcada aunque implementa LoaderManager.LoaderCallbacks<Cursor> .

Gracias por cualquier idea.


Cambia tus importaciones a

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

y use

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


En mi caso, tuve que hacer que mi Activity extendiera ActionBarActivity desde el paquete android.support.v7.app. Entonces pude usar

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


Es tarde, pero tal vez ayudar a alguien.
si usas el maneger del cargador en fragmento y tu min api está debajo de HONEYCOMB
deberías usar estas importaciones

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;

y para iniciar el cargador usa este código

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

Espero que esto ayude a alguien.


Estaba teniendo un problema similar cuando mi AsyncTaskLoader no devolvía mi lista, pero mi resolución era cambiar la llamada de .initLoader a .restartLoader.

Entonces nunca llamé a .initLoader y llamé inmediatamente a .restartLoader.

Tenía un oyente onListItemClick en mi fragmento y cada vez que salía del fragmento y recargaba onListItemClick y navegaba a través de la aplicación, seguía fallando.

Puede ser específico de mi aplicación, pero espero que ayude a otros si tienen problemas de recarga de backstack.

Esto formaba parte de una parte del administrador de archivos en mi aplicación, por lo que es específico hacer clic en múltiples onListItemClicks en el fragmento que está cargando.


Estoy usando ActionBarSherlock con mi aplicación y también me encontré con este problema y trabajé en todos los pasos discutidos por otros en esta pregunta. Sin embargo, seguí teniendo el mismo problema después de probar todas las resoluciones sugeridas.

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

El problema era que había caído en la expectativa de que Eclipse me dijera cuando me estaba perdiendo algo y me lo decía, pero no de la manera en que estaba acostumbrado. Normalmente, Eclipse en otros casos me dice que me estoy perdiendo las anulaciones para hacer que algo funcione, pero no lo dice directamente aquí. Finalmente me di cuenta de que "LoaderManager.LoaderCallbacks" era el problema y me di cuenta de que no tenía callbacks, por lo que este error fue en realidad un error muy válido. Agregar las anulaciones básicas resolvió mi problema y me permitió seguir adelante.

// 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); }


Lanzar el tercer argumento resolvió el problema en mi caso:

de

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

a

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

Nota:

  1. minSdk era 8 y estaba usando la biblioteca de soporte v4.
  2. (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this) no funcionó.
  3. getSupportLoaderManager() or getSupportLoadManager() no funcionó.
  4. Este código estaba dentro de la actividad no fragmento

Lo solucioné usando un SherlockListFragment (o podría usar ListFragment, supongo), pero lo tengo contenido dentro de una Actividad. Primero creé una clase genérica FragmentHolderActivity que se ve así:

FragmentHolderActivity.java

public class FragmentHolderActivity extends SherlockFragmentActivity { public static final String FRAGMENT_LAYOUT_RESOURCE_ID = "fragment_layout_resource_id"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Integer fragmentLayoutResourceId = getIntent().getIntExtra(FRAGMENT_LAYOUT_RESOURCE_ID, Integer.MAX_VALUE); Assert.assertNotSame(fragmentLayoutResourceId, Integer.MAX_VALUE); setContentView(fragmentLayoutResourceId); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return false; default: return super.onOptionsItemSelected(item); } } }

Entonces necesitas crear un archivo XML para tu fragmento.

your_list_fragment.xml

<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:name="com.example.YourListFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment" />

Y aquí está el código que usas para comenzar el fragmento:

Intent intent = new Intent(); intent.setClass(this, FragmentHolderActivity.class); intent.putExtra(FragmentHolderActivity.FRAGMENT_LAYOUT_RESOURCE_ID, R.layout.your_list_fragment); startActivity(intent);

Simplemente dile a FragmentHolderActivity que use el diseño your_list_fragment, que a su vez carga YourListFragment.java

A continuación, puede utilizar: getSherlockActivity().getSupportLoaderManager().initLoader(...) en YourListFragment.java

No estoy seguro de si este es el enfoque correcto , pero mantiene toda mi lógica en Fragmentos, lo cual es bueno.


Mi error fue porque esto:

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


No está utilizando las implementaciones correctas de CursorLoader y Loader . Elimine sus importaciones anteriores y use estas:

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

Pero tengo el mismo problema al usar SherlockActionBar: como tengo que extender SherlockListActivity no hay método getSupportLoadManager() .

Alguna idea sobre esto?

EDITAR: sigue este tutorial si no sabes cómo usar los fragmentos. Crea una nueva clase con extends SherlockFragment y mueve tu lógica de visualización allí. Haga que su actividad anterior amplíe SherlockFragmentActivity y muestre el nuevo SherlockFragment creado. De esta manera lo tengo funcionando. ¡Gracias a @JakeWharton!


Se encontró con el mismo problema. Mi minSdkVersion es 14, por lo que no puedo usar el paquete android.support.v4.

Lo imaginé extendiendo LoaderCallbacks, en lugar de LoaderManager.LoaderCallbacks y utilizando estos paquetes

import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; import android.database.Cursor; import android.widget.SimpleCursorAdapter;


Si ha probado todos los métodos anteriores y sigue enfrentando el mismo error con el parámetro "this", siga estos pasos:

  1. Accede a la configuración y habilita la opción de importación sobre la marcha (de manera predeterminada estará habilitada y puedes hacerlo usando las teclas Alt + Enter).

  2. Cortar todo el código de la actividad que había implementado
    LoaderCallback ... y pégalo en un editor de texto.

  3. Luego, al final copie todo el código de esa actividad del editor de texto donde lo pegó, sin ningún comando de importación (solo el código de la clase / actividad).

  4. Obtendrá muchos errores ya que aún no ha importado nada. Simplemente presiona Alt + Enter donde sea que obtengas los errores y sus bibliotecas se importarán automáticamente. Nota: Elija la biblioteca android.app ... para CursorLoaders.