2013-01-06 15 views
5

Sto seguendo il tutorial da Lars Vogella: http://www.vogella.com/articles/AndroidSQLite/article.html#todoUtilizzando Loader API 8

Ma io voglio farlo funzionare su API 8. Ho ottenuto che funziona su API 11+ e ha fatto la seguente per farlo funzionare su API 8. a Android Tools ho aggiunto una libreria di supporto e ho aggiunto le seguenti importazioni:

import android.support.v4.app.ListFragment; 
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.widget.SimpleCursorAdapter; 

Ma ancora Eclipse mi dà l'errore:

The method getLoaderManager() is undefined for the type TodosOverviewActivity 

Nel metodo:

private void fillData() { 

    // Fields from the database (projection) 
    // Must include the _id column for the adapter to work 
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY }; 
    // Fields on the UI to which we map 
    int[] to = new int[] { R.id.label }; 

    getLoaderManager().initLoader(0, null, this); 
    adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from, 
     to, 0); 

    setListAdapter(adapter); 
    } 

Qualcuno può far luce su questo errore?


ho trovato la 'soluzione' dopo, ma io non sono sicuro di come implementare questo nel tutorial, è questa la soluzione per avere il getSupportLoaderManager() e metodi relativi ListView disponibili e, se sì, come faccio implementare questo ?: correttamente

public class TodosOverviewActivity extends FragmentActivity { 

public static class TodosOverviewListFragment extends ListFragment 
     implements LoaderManager.LoaderCallbacks<Cursor> { 

La classe totale:

public class TodosOverviewActivity extends FragmentActivity implements 
    LoaderManager.LoaderCallbacks<Cursor> { 
    private static final int ACTIVITY_CREATE = 0; 
    private static final int ACTIVITY_EDIT = 1; 
    private static final int DELETE_ID = Menu.FIRST + 1; 
    // private Cursor cursor; 
    private SimpleCursorAdapter adapter; 


/** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.todo_list); 
    this.getListView().setDividerHeight(2); 
    fillData(); 
    registerForContextMenu(getListView()); 
    } 

    // Create the menu based on the XML defintion 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.listmenu, menu); 
    return true; 
    } 

    // Reaction to the menu selection 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.insert: 
     createTodo(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case DELETE_ID: 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item 
      .getMenuInfo(); 
     Uri uri = Uri.parse(MyTodoContentProvider.CONTENT_URI + "/" 
      + info.id); 
     getContentResolver().delete(uri, null, null); 
     fillData(); 
     return true; 
    } 
    return super.onContextItemSelected(item); 
    } 

    private void createTodo() { 
    Intent i = new Intent(this, TodoDetailActivity.class); 
    startActivityForResult(i, ACTIVITY_CREATE); 
    } 

    // Opens the second activity if an entry is clicked 
    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    Intent i = new Intent(this, TodoDetailActivity.class); 
    Uri todoUri = Uri.parse(MyTodoContentProvider.CONTENT_URI + "/" + id); 
    i.putExtra(MyTodoContentProvider.CONTENT_ITEM_TYPE, todoUri); 

    // Activity returns an result if called with startActivityForResult 
    startActivityForResult(i, ACTIVITY_EDIT); 
    } 



    private void fillData() { 

    // Fields from the database (projection) 
    // Must include the _id column for the adapter to work 
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY }; 
    // Fields on the UI to which we map 
    int[] to = new int[] { R.id.label }; 

    getSupportLoaderManager().initLoader(0, null, this); 
    adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from, 
     to, 0); 

    setListAdapter(adapter); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    menu.add(0, DELETE_ID, 0, R.string.menu_delete); 
    } 

    // Creates a new loader after the initLoader() call 
    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    String[] projection = { TodoTable.COLUMN_ID, TodoTable.COLUMN_SUMMARY }; 
    CursorLoader cursorLoader = new CursorLoader(this, 
     MyTodoContentProvider.CONTENT_URI, projection, null, null, null); 
    return cursorLoader; 
    } 

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

} 
+1

È la tua attività che estende 'FragmentActivity'? –

risposta

2

Il problema è che stai estendendo 'ListActivity' invece di 'ListFragment'.

Se si utilizza un ListFragment, si otterrà l'accesso a getLoaderManager() dalla libreria di supporto.

public class TodosOverviewActivity extends ListFragment { 
    private void fillData() { 
    getLoaderManager().initLoader(...); 
    } 
} 
+0

Grazie, se lo estendo con ListFragment a cui non ho accesso, ad esempio setContentView. Se estendo con FragmentActivity non ho accesso ai metodi ListView. Qualche trucco? – Diego

+0

non utilizzare ListFragment o List Activities se il tuo layout non è super semplice. In questi casi, utilizzare una normale attività o frammento e aggiungere ListView da soli. – Snicolas

1

TodosOverview L'attività dovrebbe estendere FragmentActivity e dovresti usare getSupportLoaderManager()

+0

Salve, come posso accedere a, ad esempio, setListAdapter()? – Diego