如何将cursorLoader强制转换为Loader <object> </object>

时间:2012-10-24 21:15:08

标签: java android casting android-loadermanager

希望简单的java问题我只是忘记或永远不会理解。我一直在玩Android 4.0中的Loaders。该计划正在按原样运作,但现在我正在寻找“下一个”部分。我想要一个标准的Cursor加载器和一个自定义的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 个答案:

答案 0 :(得分:30)

即使这是一个旧线程,它还没有完全回答。 tch0106触及了这里的问题,但没有完全描述。

我刚遇到同样的问题并在导入部分解决了。简单来说:一起使用支持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 :(得分:7)

检查您的导入,您可能会错误地使用这些2:

import android.content.CursorLoader;

import android.support.v4.content.CursorLoader;

答案 2 :(得分:2)

更改

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

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

第一个语句告诉jvm,返回类型是具体的Object。新语句告诉jvm任何TYPE是Object

请阅读tutorial

答案 3 :(得分: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已经自动导入了&#39; android.support.v4.content.AsyncTaskLoader&#39;。

希望这有助于某人!

答案 4 :(得分:-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>>