android – 使用AsyncTaskLoader和Fragment处理方法onCreateLoader时不兼容的类型

前端之家收集整理的这篇文章主要介绍了android – 使用AsyncTaskLoader和Fragment处理方法onCreateLoader时不兼容的类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我考虑了使用AsyncTaskLoader和Fragment( https://gist.github.com/codeswimmer/884591)的一些例子,我试图做同样的事情.但是现在我无法修复不兼容的类型错误 – 在onCreateLoader方法中.我不知道为什么会这样,因为我也做了同样的事情.

FeedLoader.java

public class FeedLoader extends AsyncTaskLoader<ArrayList<RSSItemData>> {

    ArrayList<RSSItemData> listData;
    Context ctx;
    RSSItemData RSSItem;
    final Integer HTTP_CONNECTION_TIMEOUT = 15;
    DBHelper dbHelper;


    public FeedLoader(Context context) {
        super(context);
        this.ctx = context;
        dbHelper = new DBHelper(ctx);
    }


    @Override
    public ArrayList<RSSItemData> loadInBackground() {

        listData = new ArrayList<RSSItemData>();

        if(!BaseUtils.isNetworkAvailable(ctx)) return getNewsFromDB();

        if(doWeHaveAnyNews()){

            Log.d("myLogs","We have news!");

            String data = JSONUtils.getJSON("http://I-changed-URL.com",HTTP_CONNECTION_TIMEOUT*1000,ctx);
            JSONResult result  = new Gson().fromJson(data,JSONResult.class);
            listData = result.items;

            deleteAllNewsFromDB();
            putNewsIntoDB(listData);

        }
        else{

            Log.d("myLogs","No news,retrieve from database");
            listData = getNewsFromDB();

        }

        Log.d("myLogs","Size of listData - " + listData.size());

        return listData;
    }

    public boolean doWeHaveAnyNews() {...}
    public void putNewsIntoDB(ArrayList<RSSItemData> listData) {...}
    public void deleteAllNewsFromDB() {...}
    public ArrayList<RSSItemData> getNewsFromDB() {...}

}

RetrieveFeedFragment.java

public class RetrieveFeedFragment extends Fragment implements  LoaderManager.LoaderCallbacks<ArrayList<RSSItemData>> {

    private RecyclerView rvNews;
    LinearLayout progBarLinearLayout;
    ProgressBar progBar;
    TextView progBarText;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);

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

        Log.d("myLogs","Fragment onCreate");
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

        Log.d("myLogs","Fragment onCreateView");

        View v = inflater.inflate(R.layout.news_list_fragment,null);

        rvNews = (RecyclerView) v.findViewById(R.id.listViewNews);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rvNews.setLayoutManager(llm);
        rvNews.setHasFixedSize(true);

        rvNews = (RecyclerView) v.findViewById(R.id.listViewNews);

        progBarLinearLayout = (LinearLayout) v.findViewById(R.id.progressBarLinearLayout);
        progBar = (ProgressBar) v.findViewById(R.id.progressBar);
        progBarText = (TextView) v.findViewById(R.id.progressBarText);

        return v;

    }


    @Override
    public Loader<ArrayList<RSSItemData>> onCreateLoader(int id,Bundle args) {
        return new FeedLoader(getActivity());
        /* Incompatible types ERROR
       required - anroid.support.v4.content.Loader  <java.util.ArrayList<com.project.myproject.RetrieveFeed.RSSItemData>>
       Found - com.project.myproject.RetrieveFeed.FeedLoader
       */
    }

    @Override
    public void onLoadFinished(Loader<ArrayList<RSSItemData>> loader,ArrayList<RSSItemData> listData) {
        // RSSAdapter = new RSSAdapter(listData,getActivity());
        // rvNews.setAdapter(RSSAdapter);
        // progBarLinearLayout.setVisibility(LinearLayout.GONE);
        Log.d("myLogs","onLoadFinished");
    }
    @Override
    public void onLoaderReset(Loader<ArrayList<RSSItemData>> loader) {
        Log.d("myLogs","onLoaderReset");
    }
}

MainActivity.java(以防万一)

public class MainActivity extends FragmentActivity {

    RetrieveFeedFragment fragment;;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState == null){
            fragment = new RetrieveFeedFragment();
            getSupportFragmentManager().beginTransaction().add(R.id.fragment_news,fragment,"retrieve_Feed_tag").commit();
            Log.d("myLogs","New Fragment in Activity");
        }
        else{
            fragment = (RetrieveFeedFragment) getSupportFragmentManager().findFragmentByTag("retrieve_Feed_tag");
            Log.d("myLogs","Get old Fragment by tag in Activity");
        }

    }
}

解决方法

检查你的进口.确保你正在使用 android.support.v4.app.LoaderManager.LoaderCallbacks&LT d取代;代替 android.app.LoaderManager.LoaderCallbacks&LT d取代;在你的片段和android.support.v4.content.AsyncTaskLoader< D>在您的FeedLoader中

猜你在找的Android相关文章