2012-03-29 1 views
25

Attualmente sto cercando di imparare come utilizzare i caricatori e sto avendo problemi nell'avviare un caricatore nella mia attività.Inizializzazione di un programma di caricamento in un'attività

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

public class ASwitchActivity extends Activity implements 
      LoaderManager.LoaderCallbacks<SampleLoader.SampleLoaderResult> { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     getLoaderManager().initLoader(0, null, this); 
    } 

    public Loader<SampleLoader.SampleLoaderResult> onCreateLoader(int id, Bundle args) { 
     return new SampleLoader(getBaseContext(), account, "dog"); 
} 

    public void onLoadFinished(Loader<SampleLoader.SampleLoaderResult> loader, SampleLoader.SampleLoaderResult out) 
    { 
     TextView t=(TextView)findViewById(R.id.testTV); 
     t.setText("yay"); 
    } 

    public void onLoaderReset(Loader<SampleLoader.SampleLoaderResult> loader){ 

    } 
} 

Tuttavia Eclipse dà un errore che indica:

Procedimento initLoader (int, Fascio, LoaderManager.LoaderCallbacks) nel tipo LoaderManager non è applicabile per gli argomenti (int, nullo, ActivitySwitchActivity)

Qualcuno può aiutare con dove sto andando male?

risposta

80

Come posso vedere si utilizza la libreria supportV4. Quindi, per implementare Loader si dovrebbe fare alcune cose:

  1. estendere la vostra attività dalla classe FragmentActivity
  2. metodo
  3. Uso getSupportLoaderManager invece di getLoaderManager

qui è il codice di esempio:

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.Loader; 
import android.widget.Toast; 

public class MyActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Object> { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    getSupportLoaderManager().initLoader(0, null, this); 
} 

@Override 
public Loader<Object> onCreateLoader(int i, Bundle bundle){ 
    return null; // TODO 
} 

@Override 
public void onLoadFinished(Loader loader, Object o) { 
    Toast.makeText(this, "onLoadFinished", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onLoaderReset(Loader loader) { 
    Toast.makeText(this, "onLoaderReset", Toast.LENGTH_SHORT).show(); 
} 
} 
+1

Cosa succede se estendi in origine ListActivity? Non esiste una cosa come "FragmentListActivity" che posso inserire come sostituto. –

+2

@MattHuggins ListAttività è principalmente una comodità per pochissime cose - è possibile implementare le funzionalità mancanti da soli (mantenere ListView come campo) – ataulm

1

Il terzo parametro per getLoaderManager().initLoader(0, null, this); deve essere un'istanza che implementa l'interfaccia LoaderManager.LoaderCallbacks Quindi è necessario implementare prima l'interfaccia.

+0

dispiace non ho postato il mio codice completo in precedenza, solo un estratto. Cosa intendi per interfaccia LoaderManager.LoaderCallbacks? Sarebbero il onCreateLoader, onLoadFinished e onLoaderReset? perché li ho nel mio programma? –

1

Per AppCompatActivity utilizzare getSupportLoaderManager().initLoader(0,null,this); per inizializzare il caricatore.

8

Quando si utilizza caricatori con fragments uso:

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

E quando si usano caricatori con Activity uso:

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

Ha funzionato il contrario per me. – waseefakhtar