如何将CursorLoader转换为Loader<Object>

5

希望简单的Java问题,我已经忘记或从未理解过。我一直在Android 4.0中使用Loader。程序正在按原样工作,但现在我正在寻找“下一个”部分。我想要一个标准的Cursor loader和一个自定义的AsyncTaskLoader。我卡在第1部分上,试图将cursorLoader转换为Loader并返回它。

@Override
    //public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    public Loader<Object> onCreateLoader(int id, Bundle args) {

        if (id == LISTVIEWLOADER) {
            String[] projection = { RunnerTable.COLUMN_ID,
                    RunnerTable.COLUMN_NAME };
            CursorLoader cursorLoader = new CursorLoader(getActivity(),
                    FanContentProvider.CONTENT_URI, projection, null, null,
                    null);


            return cursorLoader;   //HERE IS THE PROBLEM
        }
        return null;
    }

类型不匹配,无法将CursorLoader转换为Loader。

我相信可以通过以下方式使其正常运行

public class MainFragment extends ListFragment implements
        //LoaderManager.LoaderCallbacks<Cursor>
        LoaderManager.LoaderCallbacks

但是不喜欢这个警告:

LoaderManager.LoaderCallbacks 是一个原始类型。对泛型类型 LoaderManager.LoaderCallbacks 的引用应该被参数化。

感谢您提供的任何帮助。

5个回答

30

虽然这个帖子很老,但是它还没有被完全回答。tch0106曾经提到过这个问题,但没有详细描述。

我刚遇到了同样的问题,并在导入部分解决了它。简单来说:一起使用support Loader、CursorLoader和LoaderCallbacks。

许多类可以在Android本地库以及支持库中找到。不要将支持库和非支持库版本混合使用。

// Use these together
import android.support.v4.content.CursorLoader;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;

// Or use these, but don't mix and match
import android.content.CursorLoader;
import android.content.Loader;
import android.app.LoaderManager.LoaderCallbacks;
import android.widget.SimpleCursorAdapter;

1
这对我有用。我混合使用了import android.support.v4.content.CursorLoader和import android.app.LoaderManager.LoaderCallbacks。感谢您帮助我快速找到这个问题。有人应该将其标记为正确答案。 - Chuck Krutsinger

7

请检查您的导入,您可能会误用以下两个:

import android.content.CursorLoader;

并且

import android.support.v4.content.CursorLoader;

1
欢迎来到Stackoverflow!如果您能强调这些导入的具体误用方式,那么您的回答将更加有帮助。 - mvp

2

更改

public Loader<Object> onCreateLoader(int id, Bundle args) {

to

  public Loader<? extends Object> onCreateLoader(int id, Bundle args) {

首个声明告诉jvm,返回类型是具体的Object。 新声明告诉jvm,任何Object类型的TYPE均可。
请阅读此教程

2
恐怕仍然无法正常工作。返回类型与LoaderManager.LoaderCallbacks<Object>.onCreateLoader(int,Bundle)不兼容。 - jimsis

0

我已经解决了我的问题,与这个问题非常相似,通过改变一个导入... 我犯了一个错误,当我声明自定义加载器时。

// My custom loader java class:

import android.content.Context;
import android.content.AsyncTaskLoader;  //this was the place of my mistake right here
import java.util.ArrayList;

public class ArticleLoader extends AsyncTaskLoader<ArrayList<Article>> {

    public ArticleLoader(Context context){
        super(context);
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public ArrayList<Article> loadInBackground() {
        ArrayList<Article> articles = QueryUtils.fetchArticles(getContext());
        return articles;
    }
}

所以,发生的事情是我没有足够地注意到,Android Studio 自动导入了 'android.support.v4.content.AsyncTaskLoader'。

希望这对某些人有所帮助!

Ton


-1
看一下这个: Android AsyncTaskLoader Reference 我认为你的问题在这一行:
public class MainFragment extends ListFragment implements
    //LoaderManager.LoaderCallbacks<Cursor>
    LoaderManager.LoaderCallbacks

你应该改成这样:
public static class AppListFragment extends ListFragment
    implements LoaderManager.LoaderCallbacks<List<AppEntry>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接