7

Ricevo un errore "swapCursor (Cursore) non definito" durante la creazione di un CursorLoader. Ho importato android.support.v4 (app.LoaderManager, app.LoaderManager.Loader, Content.CursorLoader, content.Loader). Non sono sicuro di cosa posso fare per correggere questo problema. si prega di avvisare.swapCursore undefined error

caricatore:

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



public class LoginList extends FragmentActivity implements OnClickListener, 
AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor> { 

    private ListView loginList; 
    private Button webLogin; 
    private SimpleCursorAdapter adapter; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login_listview); 

     loginList = (ListView)findViewById(R.id.loginlist); 
     loginList.setOnItemClickListener(this); 

     webLogin = (Button)findViewById(R.id.button3); 
     webLogin.setOnClickListener(this); 



     //Specify fileds to display in the list 
     String[] from = new String[] { ListProvider.COLUMN_NAME_SITE }; 

     //Bind fields to listview 
     int[] to = new int[] {R.id.loginlist}; 

     // Create CursorAdapter and set it to display 
     adapter = new SimpleCursorAdapter(this, R.layout.login_listview, null, from, to); 

     loginList.setAdapter(adapter); 

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

    /*@Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

    super.onViewCreated(view, savedInstanceState); 
    setEmptyText(getResources().getString(string.app_name)); 
    rwgisterForContextMenu(getListView()); 
    setHasOptionsMenu(true); 
     } */ 


    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

     Toast.makeText(getApplicationContext(), "Selected ID :" + arg2, Toast.LENGTH_SHORT).show(); 

     Intent updateDeleteLoginInfo = new Intent (this, UpdateDeleteLoginList.class); 


     Cursor clickedObject = (Cursor)loginList.getItemAtPosition(arg2); 

     Bundle loginBundle = new Bundle(); 
     loginBundle.putString("clickedWebSite",((LoginDetails) clickedObject).getsName()); 
     loginBundle.putString("clickedWebAddress",((LoginDetails) clickedObject).getwUrl()); 
     loginBundle.putString("clickedUserName",((LoginDetails) clickedObject).getuName()); 
     loginBundle.putString("clickedPassWord",((LoginDetails) clickedObject).getpWord()); 
     loginBundle.putString("clickedNotes",((LoginDetails) clickedObject).getlNotes()); 

     updateDeleteLoginInfo.putExtras(loginBundle); 

     startActivityForResult(updateDeleteLoginInfo, 0); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     Intent webLoginIntent = new Intent (this, LoginPlusActivity.class); 
     startActivity(webLoginIntent); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int ignored, final Bundle args) { 
     return new CursorLoader(this, ListProvider.CONTENT_URI, null, null, null, null); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
     adapter.swapCursor(cursor); /* swapCursor error: The method swapCursor(Cursor) is undefined for the type SimpleCursorAdapter */ 


    } 

    @Override 
    public void onLoaderReset (Loader<Cursor> loader) { 
     adapter.swapCursor(null); /* swapCursor error: The method swapCursor(Cursor) is undefined for the type SimpleCursorAdapter */ 

    } 
} 
+2

assicurarsi che si sta importando 'android.support.v4.widget.CursorAdapter' e non' android.widget.CursorAdapter' –

+0

@vmironov importazione, ma l'errore di inserimento ancora exsist – user1165694

+0

Cosa vmironov probabilmente intendeva dire è quello di utilizzare 'android.support.v4.widget.SimpleCursorAdapter' anziché 'android.widget.SimpleCursorAdapter'. In alternativa, 'changeCursor' è disponibile in tutte le versioni ma ha lo svantaggio di chiudere il vecchio cursore (quindi il codice Loader probabilmente fallirà) – Delyan

risposta

0

nel metodo onCreate() si inizializza la scheda passando il ListView come secondo argomento. Questo non è corretto, dovrebbe essere l'ID di un layout di creare un'istanza per ogni elemento della lista:

adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null, from, to); 

Diverso da quello che il codice sia bene a me. L'ho confrontato con il mio codice di lavoro che utilizzava un ListFragment, quindi non istanzio un'interfaccia utente ma sostituisco il metodo onActivityCreated(Bundle).

Mi sono preso la briga di fornire una proiezione per ridurre la quantità di dati estratti dal database dal mio ContentProvider, ma passare null non dovrebbe essere un problema.

Tuttavia, verificare di fornire la colonna "_id" della chiave primaria lunga come ContentProvier. Per utilizzare ListView (e alcuni degli altri widget) è necessario disporre di una chiave primaria basata su Long, che ho trovato davvero scomodo in quanto avevo già un UUID perfettamente accettabile come chiave primaria.

2

Esempio su come utilizzare changeCursor() con LoaderManager.LoaderCallbacks invece di swapCursor().

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(this, DB_table.CONTENT_URI, DB_table.PROJECTION,null,null,null); 
} 

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

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.changeCursor(null); 
} 

se si desidera utilizzare lo swapCursor() disponibili in API 11 per anziani API, ricordarsi di importare il CursorAdapter dalla libreria di supporto.

import android.support.v4.widget.CursorAdapter;