Android getLoaderManager().initLoader()不';不接受';这';作为参数,类(ListFragment)实现LoaderManager.LoaderCallbacks<;光标>;

Android getLoaderManager().initLoader()不';不接受';这';作为参数,类(ListFragment)实现LoaderManager.LoaderCallbacks<;光标>;,android,sqlite,android-loadermanager,android-listfragment,Android,Sqlite,Android Loadermanager,Android Listfragment,我在Android中使用SQLite时遇到问题。我使用的是ListFragment而不是ListActivity(如示例所示),因此我使用了ListFragment实现LoaderManager.LoaderCallbacks。然后,在ListFragment中的fillData()方法中: private void fillData() { // Fields from the database (projection) // Must include the _id colu

我在Android中使用SQLite时遇到问题。我使用的是
ListFragment
而不是
ListActivity
(如示例所示),因此我使用了
ListFragment
实现
LoaderManager.LoaderCallbacks
。然后,在
ListFragment
中的
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)
类型LoaderManager中的方法initLoader(int,Bundle,LoaderManager.LoaderCallbacks)不适用于参数(int,null,NotesActivity.ArrayListFragment)
在标记行上,即使
实现了
LoaderManager.LoaderCallbacks


谢谢你的建议。

有几件事需要注意(根据我最近与之斗争的经验):

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

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
  • 您在使用ListFragment时提到了这一点,但需要重复:不要扩展活动,否则支持包将无法工作。而是扩展FragmentActivity类或ListFragment类

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

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

  • 希望这能帮助你。。。或者至少是其他人

    您没有使用正确的
    CursorLoader
    Loader
    实现。 删除旧导入并使用以下导入:

    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()

    有什么想法吗


    编辑:如果您不知道如何使用片段,请遵循。使用extends SherlockFragment创建一个新类,并将显示逻辑移到那里。使旧活动扩展SherlockFragmentActivity并显示新创建的SherlockFragment。这样我就可以工作了。感谢@JakeWharton

    我通过使用SherlockListFragment(或者我想你也可以使用ListFragment)解决了这个问题,但是将它包含在活动中。我首先创建了一个通用FragmentHolderActivity类,如下所示:

    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);
            }
        }
    
    }
    
    然后需要为片段创建一个XML文件

    您的\u列表\u 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" />
    
    您只需告诉FragmentHolderActivity使用your_list_片段布局,该布局将依次加载YourListFragment.java

    然后可以在YourListFragment.java中使用:
    getSherlockActivity().getSupportLoaderManager().initLoader(…)


    不确定这是否是正确的方法,但它将我所有的逻辑保留在片段中,这很好。

    我在我的应用程序中使用ActionBarSherlock,我也遇到了这个问题,并完成了其他人在这个问题中讨论的所有步骤。然而,在尝试了所有建议的解决方案之后,我仍然有同样的问题

    The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, this)
    
    类型LoaderManager中的方法initLoader(int,Bundle,LoaderManager.LoaderCallbacks)不适用于参数(int,null,this)
    
    问题是我已经陷入了一种期待,当我丢失了一些东西时,Eclipse会告诉我,它会告诉我,但不是以我习惯的方式。通常,Eclipse在其他情况下会告诉我,我缺少使某些东西工作的覆盖,但这里并没有直接说明这一点。我最终发现“LoaderManager.LoaderCallbacks”是一个问题,并意识到我没有回调它,因此这个错误实际上是一个非常有效的错误。添加基本覆盖解决了我的问题,并允许我继续前进

    // 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);
    }
    
    //在initLoader()调用之后创建一个新的加载程序
    @凌驾
    公共加载器onCreateLoader(int-id,Bundle-args){
    //工作
    返回null;
    }
    @凌驾
    public void onLoadFinished(加载器、光标数据){
    适配器。swapCursor(数据);
    }
    @凌驾
    公共void onLoaderReset(加载器){
    //数据不再可用,请删除引用
    适配器.swapCursor(空);
    }
    
    遇到了相同的问题。我的Minsdk版本是14,因此无法使用android.support.v4软件包

    我是通过扩展LoaderCallbacks而不是LoaderManager.LoaderCallbacks来实现的,并使用这些包

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

    第三个论点解决了我的问题:

    getLoaderManager().initLoader(0,null,(android.app.LoaderManager.LoaderCallbacks)this);
    
    注:

  • minSdk当时8岁,我使用的是支持库v4
  • (android.support.v4.app.LoaderManager.LoaderCallbacks)这个)
    不起作用
  • getSupportLoaderManager()或getSupportLoadManager()
    不起作用
  • 此代码位于活动内部,而不是片段

  • 我的错误是因为:

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

    在我的情况下,我必须让我的活动从android.support.v7.app包中扩展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);
    

    虽然很晚了,但也许可以帮助别人。
    如果您在片段中使用loader maneger,并且您的最小api位于蜂巢下方
    你应该用这个

    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*/);
    

    希望这对您有所帮助。

    如果您尝试了上述所有方法,但“this”参数仍面临相同的错误,请执行以下步骤:

  • 转到“设置”并启用“即时导入”选项。(默认情况下,它将 可以通过使用Alt+Enter键来启用)

  • 剪切已实施活动的全部代码
    LoaderCallback。。。并将其粘贴到文本编辑器中

  • 最后从文本编辑器中复制该活动的全部代码 粘贴的位置,没有任何导入命令。(只有
    getSupportLoaderManager().initLoader(0, null, this);
    
    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*/);
    
    android.support.v4.app.LoaderManager loaderManager = getSupportLoaderManager();
    
    loaderManager.initLoader(LOADER_ID, null,  this);
    
    //import android.support.v4.app.LoaderManager;
    import android.app.LoaderManager;
    import android.support.v4.app.NavUtils;
    //import android.support.v4.content.CursorLoader;
    import android.content.CursorLoader;
    //import android.support.v4.content.Loader;
    //import android.content.Loader;
    
    getSupportLoaderManager().initLoader(LOADER_ID,null,this);
    
    getLoaderManager().initLoader(LOADER_ID,null,this);
    
    getLoaderManager().initLoader(0, null, this); 
    
    LoaderManager.getInstance(this).initLoader(0, null, this);
    
    /**
     * @deprecated Use
     * {@link LoaderManager#getInstance(LifecycleOwner) LoaderManager.getInstance(this)}.
     */
    
    getSupportLoaderManager().initLoader(id, null, this);
    
    getSupportLoaderManager().initLoader(id, null, this);