尽pipe类(ListFragment)实现LoaderManager.LoaderCallbacks <cursor>,但getLoaderManager()。initLoader()不接受“this”作为参数。

按照在Android中使用SQLite的指导 ,我遇到了麻烦。 我使用ListFragment而不是ListActivity (如示例中所示),所以我使用ListFragment实现LoaderManager.LoaderCallbacks<Cursor>来代替。 然后,在fillData()方法中:

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

我得到的错误:

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

即使this实现了LoaderManager.LoaderCallbacks<Cursor>

谢谢你的任何想法。

您没有使用正确的CursorLoaderLoader 。 删除旧的import,并使用这些:

 import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; 

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

任何想法呢?

编辑:按照这个教程,如果你不知道如何使用片段。 创build一个扩展SherlockFragment的新类,并在那里移动显示逻辑。 让你的旧活动扩展SherlockFragmentActivity,并显示新创build的SherlockFragment。 这样我才能工作。 感谢@JakeWharton!

一些需要注意的事情(从我最近的经验来看):

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

     getSupportLoaderManager().initLoader(LOADER_ID, null, this); 
  2. 当你提到你使用ListFragment的时候,你提到过这个问题,但是需要重复一下:不要扩展Activity,否则支持包将不起作用。 相反,扩展FragmentActivity类或ListFragment类。

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

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

希望这可以帮助你…或者至less是别人…

施放第三个参数解决了我的情况下的问题:

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

  getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this); 

注意:

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

已经很晚了,但也许有帮助。
如果你在碎片中使用loader maneger,并且你的api低于HONEYCOMB
你shuld使用这个import

 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.app.Fragment; 

并为启动加载程序使用此代码

 getActivity().getSupportLoaderManager().initLoader(/loader stuff*/); 

希望这有助于一个人。

我的错误是因为这个:

 //import android.app.ListFragment; Error when doesnt import from support.v4 import android.support.v4.app.ListFragment; 

在我的情况下,我必须从android.support.v7.app包中获得Activity extend ActionBarActivity。 那时我才能够使用

getSupportLoaderManager()。initLoader(0,null,this);

更改您的导入

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

并使用

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

我正在使用ActionBarSherlock和我的应用程序,我也遇到了这个问题,并通过其他人在这个问题上讨论的所有步骤。 但是,在尝试所有build议的解决scheme后,我仍然遇到同样的问题。

 The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, this) 

问题是当我错过一些东西的时候,我曾经期待Eclipse能告诉我,它告诉我,但不是我习惯的方式。 通常Eclipse在其他情况下会告诉我,我错过了重写,使一些工作,但它不是直接在这里说。 我终于拿起了“LoaderManager.LoaderCallbacks”是问题,并意识到我没有callback,因此这个错误实际上是一个非常有效的错误。 添加基本​​覆盖解决了我的问题,并允许我前进。

 // Creates a new loader after the initLoader () call @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // do work return null; } @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); } 

我通过使用SherlockListFragment(或者你可以使用ListFragment,我想)来解决这个问题,但是它包含在一个Activity中。 我首先创build了一个如下所示的genericsFragmentHolderActivity类:

FragmentHolderActivity.java

 public class FragmentHolderActivity extends SherlockFragmentActivity { public static final String FRAGMENT_LAYOUT_RESOURCE_ID = "fragment_layout_resource_id"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Integer fragmentLayoutResourceId = getIntent().getIntExtra(FRAGMENT_LAYOUT_RESOURCE_ID, Integer.MAX_VALUE); Assert.assertNotSame(fragmentLayoutResourceId, Integer.MAX_VALUE); setContentView(fragmentLayoutResourceId); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return false; default: return super.onOptionsItemSelected(item); } } } 

然后,您需要为您的片段创build一个XML文件。

your_list_fragment.xml

 <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:name="com.example.YourListFragment" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/fragment" /> 

这里是你用来开始片段的代码:

  Intent intent = new Intent(); intent.setClass(this, FragmentHolderActivity.class); intent.putExtra(FragmentHolderActivity.FRAGMENT_LAYOUT_RESOURCE_ID, R.layout.your_list_fragment); startActivity(intent); 

您只需告诉FragmentHolderActivity使用your_list_fragment布局,然后依次加载YourListFragment.java

然后,您可以在getSherlockActivity().getSupportLoaderManager().initLoader(...)使用getSherlockActivity().getSupportLoaderManager().initLoader(...)

不知道这是否是正确的方法,但它保持了我所有的碎片逻辑,这是很好的。

跑到同样的问题。 我的minSdkVersion是14,所以不能使用android.support.v4包。

我想通过扩展LoaderCallbacks而不是LoaderManager.LoaderCallbacks并使用这些包

 import android.app.LoaderManager.LoaderCallbacks; import android.content.CursorLoader; import android.database.Cursor; import android.widget.SimpleCursorAdapter; 

如果您已经尝试了上述所有方法,仍然面临与“this”参数相同的错误,请按照下列步骤操作:

  1. 转到设置并启用导入dynamic选项(默认情况下,它将被启用,你可以通过使用Alt + Enter键来完成)。

  2. 削减已经实施的活动的整个代码
    LoaderCallback …并将其粘贴到文本编辑器中。

  3. 然后,最后从粘贴的文本编辑器中复制该活动的整个代码,而不需要任何导入命令(仅限于类/活动的代码)。

  4. 由于您尚未导入任何内容,因此会出现很多错误。 只要按下Alt + Enter,你会得到错误,它的库将被自动导入。 注意:为CursorLoadersselectandroid.app …库。