2013-01-06 19 views
5

Obserwuję samouczka od Lars Vogella: http://www.vogella.com/articles/AndroidSQLite/article.html#todoKorzystanie Loader API 8

ale chcę go do pracy na API 8. Mam to działa na API 11+ i zrobił to po to, aby pracować na 8. na Narzędzia API Androida dodałem Biblioteka wsparcia i dodałem następujące import:

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; 

Ale nadal Eclipse daje mi błąd:

The method getLoaderManager() is undefined for the type TodosOverviewActivity 

w metodzie:

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

Czy ktoś może oświetlić ten błąd?


znalazłem następującą „rozwiązania”, ale nie jestem pewien, jak zaimplementować to w tutorialu, jest to rozwiązanie dla mające getSupportLoaderManager() i metody związane z ListView dostępne, a jeśli tak, to jak mogę zaimplementować to poprawnie ?:

public class TodosOverviewActivity extends FragmentActivity { 

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

całkowita Class:

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

Czy Twoja działalność obejmuje rozszerzenie "FragmentActivity"? –

Odpowiedz

2

Problem polega na tym, że rozszerzasz "ListActivity" zamiast "ListFragment".

Jeśli korzystasz z funkcji ListFragment, uzyskasz dostęp do funkcji getLoaderManager() z biblioteki pomocy.

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

Dzięki, jeśli rozszerzę go o ListFragment, nie mam dostępu do np. SetContentView. Jeśli rozszerzam o FragmentActivity, nie mam dostępu do metod ListView. Jakieś sztuczki? – Diego

+0

nie używaj ListFragment lub List Activity, jeśli twój układ nie jest prosty. W takich przypadkach użyj normalnej aktywności lub fragmentu i dodaj ListView samodzielnie. – Snicolas

1

TodosOverview Działanie powinno rozszerzyć FragmentActivity i powinieneś użyć getSupportLoaderManager()

+0

Witam, w jaki sposób uzyskać dostęp do, na przykład setListAdapter()? – Diego

Powiązane problemy