7

Ich erhalte einen Fehler "swapCursor (Cursor) ist nicht definiert" beim Erstellen eines CursorLoader. Ich habe die android.support.v4 (app.LoaderManager, app.LoaderManager.Loader, Content.CursorLoader, content.Loader) importiert. Ich bin mir nicht sicher, was ich tun kann, um dieses Problem zu beheben. Bitte beraten.swapCursor undefined Fehler

Lader:

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

stellen Sie sicher, Sie importieren 'android.support.v4.widget.CursorAdapter' und nicht' android.widget.CursorAdapter' –

+0

@vmironov Hinzugefügt Import aber Fehler exsist noch – user1165694

+0

Was vmironov wohl sagen wollte bedienen 'android.support.v4.widget.SimpleCursorAdapter' anstelle von' android.widget.SimpleCursorAdapter'. Alternativ ist 'changeCursor' in allen Versionen verfügbar, hat aber den Nachteil, dass der alte Cursor geschlossen wird (der Loader-Code wird also wahrscheinlich nicht funktionieren). – Delyan

Antwort

0

In Ihrem onCreate() Methode initialisieren Sie Ihren Adapter die ListView als zweites Argument übergeben. Das ist falsch, es sollte die ID eines Layouts für jedes Element in der Liste instanziieren:

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

Ansonsten ist Ihr Code sieht für mich in Ordnung. Ich habe es mit meinem Arbeitscode verglichen, der ein ListFragment verwendet, also instanziiere ich keine UI, sondern überschreibe die Methode onActivityCreated(Bundle).

Ich habe mir die Mühe gemacht, eine Projektion zur Verfügung zu stellen, um die Menge an Daten zu reduzieren, die von meiner Datenbank ContentProvider extrahiert wurden, aber null sollte kein Problem sein.

Überprüfen Sie jedoch, ob Sie die Primärschlüsselspalte "_id" als Long in Ihrer ContentProvier angeben. Um ListView (und einige der anderen Widgets) zu verwenden, müssen Sie einen Long-basierten Primärschlüssel haben, was ich als sehr unbequem empfand, da ich bereits eine vollkommen akzeptable UUID als Primärschlüssel hatte.

2

Beispiel zur Verwendung von changeCursor() mit LoaderManager.LoaderCallbacks anstelle von 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); 
} 

, wenn Sie die swapCursor() in API 11 für ältere API verwenden möchten, denken Sie daran, die Cursor von der Support-Bibliothek zu importieren.

import android.support.v4.widget.CursorAdapter;