GetLoaderManager (). InitLoader () no acepta 'this' como argumento aunque la clase (ListFragment) implementa LoaderManager.LoaderCallbacks <Cursor>
Tengo problemas para seguir una guía sobre el uso de SQLite en Android. Estoy utilizando un ListFragment
lugar de ListActivity
(como en el ejemplo), así que tengo el ListFragment
implementar LoaderManager.LoaderCallbacks<Cursor>
lugar. A continuación, 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); }
Tengo el error:
- Base de datos de exportación de importación android
- Android MediaStore obtiene distintas carpetas de archivos de música
- Sqlite Browser no responde mientras inserta datos en sqlite
- Error de Android escribiendo datos de ubicación en la base de datos SQLite de la clase LocationListener
- Inserte un número de cadena que empiece por cero en la columna de cadena usando ContentValues, pero el cero inicial siempre se elimina
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 this
implemente LoaderManager.LoaderCallbacks<Cursor>
.
Gracias por cualquier idea.
- Citas de Android dentro de una cadena de consulta SQL
- ¿Se trata de una consulta SQLite válida?
- Obtener el ID del elemento ListView seleccionado (datos rellenos con DB de SQLite)
- Android One Plus Two: No se pudo cambiar la configuración regional para db
- Android SqliteAssetHelper - fusionar las tablas de la base de datos del activo con el existente
- Estrategia para actualizar la aplicación de Android (con base de datos)
- NotifyChange con uri modificado de contentProvider.update ()
- No se puede degradar la base de datos de la versión 2 a 1 incluso después de una nueva instalación y volver a ejecutar
No está utilizando las implementaciones correctas de CursorLoader
y Loader
. Elimine sus importaciones antiguas y utilice 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 usando SherlockActionBar: Como tengo que extender SherlockListActivity
no hay método getSupportLoadManager()
.
¿Ideas sobre esto?
EDIT: siga este tutorial si no sabe cómo usar fragmentos. Cree una nueva clase con extends SherlockFragment y mueva su lógica de visualización allí. Haga que su antigua actividad amplíe SherlockFragmentActivity y muestre el SherlockFragment recién creado. De esta manera lo conseguí trabajando. Gracias a @JakeWharton!
Algunas cosas a tener en cuenta (de mi reciente experiencia luchando con esto):
-
Si su minSDK está configurado a menos de 11 (es decir, nivel 10 para Gingerbread) y está utilizando el Support Pack para comprobar la compatibilidad con versiones anteriores, asegúrese de usar
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
-
Usted mencionó esto cuando dijo que está usando ListFragment, pero se repite: No extender Actividad, de lo contrario el paquete de soporte no funcionará. En su lugar, expanda la clase FragmentActivity o la clase ListFragment.
-
Para sus importaciones, asegúrese de que está 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 …
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:
- MinSdk era 8 y yo estaba usando la biblioteca de soporte v4.
-
(android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)
no funcionó. -
getSupportLoaderManager() or getSupportLoadManager()
no funcionaron. - Este código fue dentro de la actividad no fragmento
Mi error fue porque:
//import android.app.ListFragment; Error when doesnt import from support.v4 import android.support.v4.app.ListFragment;
Es tarde pero quizá ayude a alguien.
Si usted utiliza el maneger del cargador en el fragmento y usted 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 cargador utilizar este código
getActivity().getSupportLoaderManager().initLoader(/loader stuff*/);
Espero que esto ayude a alguien.
Cambie sus 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);
Estoy usando ActionBarSherlock con mi aplicación y yo también estaba corriendo en este problema y trabajado a través de todos los pasos discutidos por otros en esta cuestión. Sin embargo, seguía 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 espera de Eclipse para decirme cuando me faltaba algo y me estaba diciendo eso, pero no de la manera que estaba acostumbrado. Típicamente Eclipse en otros casos me diría que estoy perdiendo las anulaciones para hacer algo funcionar pero no es directamente decir eso aquí. Finalmente me recogió en el "LoaderManager.LoaderCallbacks" siendo el problema y se dio cuenta de que no tenía devoluciones de llamada por lo que este error fue en realidad un error muy válido. La adición de las sustituciones 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); }
En mi caso tuve que tener mi actividad extender ActionBarActivity desde el paquete android.support.v7.app. Entonces pude usar
GetSupportLoaderManager (). InitLoader (0, null, this);
Conseguí alrededor de esto usando un SherlockListFragment (o usted podría utilizar ListFragment, supongo), pero lo han contenido dentro de una actividad. Primero creé una clase genérica de FragmentHolderActivity que se parece a esto:
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); } } }
A continuación, debe crear un archivo XML para su 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 iniciar 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);
Usted acaba de decir el FragmentHolderActivity para utilizar el layout your_list_fragment, que a su vez carga el 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, que es agradable.
Funcionó en el mismo problema. Mi minSdkVersion es 14, por lo que no se puede utilizar el paquete android.support.v4.
Lo calculé extendiendo LoaderCallbacks, en lugar de LoaderManager.LoaderCallbacks y usar estos paquetes
import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; import android.database.Cursor; import android.widget.SimpleCursorAdapter;
Si ha intentado todos los métodos anteriores y sigue enfrentando el mismo error con el parámetro "this", siga estos pasos:
-
Vaya a la configuración y habilite las importaciones al momento (por defecto, estará habilitado y puede hacerlo usando las teclas Alt + Enter).
-
Cortar todo el código de la actividad que había implementado
LoaderCallback … y pegarlo en un editor de texto. -
Finalmente, copiar todo el código de esa actividad desde el editor de texto donde se ha pegado, sin ningún comando de importación (sólo el código de la clase / actividad).
-
Obtendrás muchos errores ya que no has importado nada todavía. Solo presiona Alt + Enter dondequiera que estés recibiendo los errores y tus bibliotecas serán importadas automáticamente. Nota: Elija la biblioteca android.app … para CursorLoaders.