65

我无法按照在 Android 中使用 SQLite的指南进行操作。我使用的是 aListFragment而不是 a 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);
}

我得到错误:

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>

谢谢你的任何想法。

4

19 回答 19

84

您没有使用正确的 CursorLoaderand实现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!

于 2012-07-11T18:47:01.977 回答
59

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

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

    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;
    

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

于 2012-07-06T02:17:00.660 回答
10

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

 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. 此代码在活动内部而不是片段
于 2014-06-18T06:21:35.353 回答
4

已经晚了,但也许可以帮助一些人。
如果您在片段中使用加载程序管理器并且您的 min api 低于 HONEYCOMB
您应该使用此导入

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

希望这对某人有所帮助。

于 2016-06-20T11:47:04.297 回答
3

将您的导入更改为

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

并使用

getSupportLoaderManager().initLoader(0, null, this);
于 2016-02-12T14:51:44.320 回答
3

这就是你所拥有的:

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

这是你应该拥有的:

LoaderManager.getInstance(this).initLoader(0, null, this);

第一个不工作的原因:

/**
 * @deprecated Use
 * {@link LoaderManager#getInstance(LifecycleOwner) LoaderManager.getInstance(this)}.
 */
于 2020-04-12T09:43:28.357 回答
2

我的错误是因为这个:

//import android.app.ListFragment; Error when doesnt import from support.v4
import android.support.v4.app.ListFragment;
于 2014-10-01T13:47:21.247 回答
2

就我而言,我必须让我的 Activity 从 android.support.v7.app 包中扩展 ActionBarActivity。然后我就可以使用

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

于 2015-06-24T22:28:16.777 回答
1

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

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”是问题所在,并意识到我没有回调它,因此这个错误实际上是一个非常有效的错误。添加基本​​覆盖解决了我的问题并让我继续前进。

// 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);
}
于 2013-02-02T16:52:16.393 回答
1

我遇到了类似的问题,我的 AsyncTaskLoader 没有返回我的列表,但我的解决方案是将调用从 .initLoader 更改为 .restartLoader。

所以我实际上从未调用过 .initLoader,只是立即调用了 .restartLoader。

我的片段中有一个 onListItemClick 侦听器,每次退出片段并重新加载 onListItemClick 并浏览它一直崩溃的应用程序。

它可能只是针对我的应用程序,但如果他们遇到片段回栈重新加载问题,希望它可以帮助其他人。

这是我的应用程序中文件管理器部分的一部分,因此它特定于单击您正在加载的片段中的多个 onListItemClicks。

于 2017-12-02T22:12:29.110 回答
0

我通过使用 SherlockListFragment(或者您可以使用 ListFragment,我想)解决了这个问题,但将其包含在 Activity 中。我首先创建了一个通用的 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 文件。

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(...)在 YourListFragment.java

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

于 2013-01-21T14:38:19.650 回答
0

遇到同样的问题。我的 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;
于 2013-11-15T01:13:51.540 回答
0

如果您已经尝试了上述所有方法,但使用“this”参数仍然遇到相同的错误,请按照以下步骤操作:

  1. 转到设置并启用即时导入选项。(默认情况下它将启用,您可以使用 Alt+Enter 键来执行此操作)。


  2. 剪切已实现LoaderCallback...的活动的整个代码并将其粘贴到文本编辑器中。

  3. 然后最后从您粘贴的文本编辑器中复制该活动的整个代码,没有任何导入命令。(只有类/活动的代码)。

  4. 你会得到很多错误,因为你还没有导入任何东西。只要在出现错误的地方按 Alt+Enter,它的库就会自动导入。注意:为 CursorLoaders 选择 android.app... 库。

于 2017-04-23T19:01:36.647 回答
0

试试这两条线它会工作

android.support.v4.app.LoaderManager loaderManager = getSupportLoaderManager();

loaderManager.initLoader(LOADER_ID, null,  this);
于 2018-08-31T00:17:22.677 回答
0

我正在使用 minSDK 27 并且遇到了同样的问题,我尝试像@Dexter 建议的那样进行投射,但是给出了一个错误提示cannot be cast to android.app.LoaderManager$LoaderCallbacks,所以我然后尝试使用不同的导入语句并且这有效。我注释掉了这些v4版本,这就是我现在拥有的,并且该应用程序正在运行:

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

不太确定何时/如何v4导入版本。

于 2018-09-27T12:22:15.093 回答
0

0

经过长时间的牺牲,如果您使用的是片段,我得到了这个解决方案,那么只需使用这段代码。

getActivity().getSupportLoaderManager().initLoader(1, null, YourActivity.this);

我希望这对你有帮助

于 2019-01-02T12:36:53.823 回答
0

我试图initLoader()在活动中调用。对我来说这有效

改变

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

getLoaderManager().initLoader(LOADER_ID,null,this);
于 2020-01-05T07:21:17.477 回答
0

如果您使用 API 28 或更高版本,请不要getLoaderManager使用:

getSupportLoaderManager().initLoader(id, null, this);
于 2020-04-17T16:22:42.913 回答
0

如果您使用 API 29,而不是 getLoaderManager 使用:

getSupportLoaderManager().initLoader(id, null, this);
于 2020-05-07T10:21:18.793 回答