getLoaderManager().initLoader()不接受'this'作为参数,尽管类(ListFragment)实现了LoaderManager.LoaderCallbacks <Cursor>

vur*_*rp0 64 sqlite android android-listfragment android-loadermanager

我在遵循Android中使用SQLite 的指南时遇到了麻烦.我正在使用a ListFragment而不是ListActivity(如示例中所示),所以我使用了ListFragment工具LoaderManager.LoaderCallbacks<Cursor>.然后,在以下fillData()方法中ListFragment:

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

    getLoaderManager().initLoader(0, null, this); //error
    adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.notes_row, null, from, to, 0);
    setListAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, NotesActivity.ArrayListFragment)
Run Code Online (Sandbox Code Playgroud)

在标记的行上即使this实现LoaderManager.LoaderCallbacks<Cursor>.

谢谢你的任何想法.

Mat*_*s B 83

您没有使用权的实现 CursorLoaderLoader.删除旧的导入并使用这些导入:

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
Run Code Online (Sandbox Code Playgroud)

但是我使用SherlockActionBar有同样的问题:因为我必须扩展,SherlockListActivity所以没有方法getSupportLoadManager().

有什么想法吗?

编辑:如果您不知道如何使用片段,请按照本教程.使用扩展SherlockFragment创建一个新类,并在那里移动您的显示逻辑.让您的旧活动扩展SherlockFragmentActivity并显示新创建的SherlockFragment.这样我就搞定了.感谢@JakeWharton!

  • `SherlockListActivity`扩展了`ListActivity`.支持片段和加载器是支持库的一部分,这意味着您需要扩展`FragmentActivity`(或`SherlockFragmentActivity`). (15认同)
  • `setContentView(android.R.layout.list_content)`和你神奇地拥有相同的东西! (2认同)

小智 59

需要注意的一些事项(根据我最近与此斗争的经验):

  1. 如果您的minSDK设置为小于11(即Gingerbread的10级)并且您使用支持包以实现向后兼容性,请确保使用

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 当你说你正在使用ListFragment时,你提到了这一点,但它需要重复:不要扩展Activity,否则支持包将不起作用.相反,扩展FragmentActivity类或ListFragment类.

  3. 对于您的导入,如果您的minSDK <11,请确保使用正确的版本:

     android.support.v4.app.FragmentActivity;
     android.support.v4.app.LoaderManager;
     android.support.v4.content.Loader;
    
    Run Code Online (Sandbox Code Playgroud)

希望这可以帮助你......或者至少是其他人......


Dex*_*ter 10

在我的情况下,转换第三个参数解决了问题:

 getLoaderManager().initLoader(0, null, this);
Run Code Online (Sandbox Code Playgroud)

 getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this);
Run Code Online (Sandbox Code Playgroud)

注意:

  1. minSdk是8,我正在使用支持库v4.
  2. (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this) 不工作.
  3. getSupportLoaderManager() or getSupportLoadManager() 不工作.
  4. 这段代码是内部活动而不是片段

  • 这会为我抛出一个RuntimeException,我不知道它是如何工作的,除非它永远不会被执行. (2认同)