【问题标题】:How to cast cursorLoader to Loader<Object>如何将 cursorLoader 转换为 Loader<Object>
【发布时间】:2012-10-24 21:15:07
【问题描述】:

希望是我刚刚忘记或从未理解的简单 Java 问题。我一直在使用 Android 4.0 中的加载器。该程序按原样运行,但现在我正在寻找“下一个”部分。我想要一个标准的光标加载器和一个自定义的 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 的引用应该被参数化

感谢您提供的任何帮助。

【问题讨论】:

    标签: java android casting android-loadermanager


    【解决方案1】:

    尽管这是一个旧线程,但尚未完全回答。 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;
    

    【讨论】:

    • 这对我有用。我将导入 android.support.v4.content.CursorLoader 与导入 android.app.LoaderManager.LoaderCallbacks 混合在一起。谢谢你帮我快速找到这个。有人应该将此标记为正确答案。
    【解决方案2】:

    检查你的导入,你可能会误用这两个:

    import android.content.CursorLoader;
    

    import android.support.v4.content.CursorLoader;
    

    【讨论】:

    • 欢迎来到 Stackoverflow!如果您强调这些导入是如何被滥用的,您的回答会更有帮助。
    【解决方案3】:

    改变

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

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

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

    请阅读此tutorial

    【讨论】:

    • 恐怕还是不行。返回类型与 LoaderManager.LoaderCallbacks.onCreateLoader(int, Bundle) 不兼容。
    【解决方案4】:

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

    // 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”。

    希望这对某人有所帮助!

    【讨论】:

      【解决方案5】:

      看看这个: 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>>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2017-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多