2016-08-08 5 views
1

Хорошо, я сдаюсь. Я не могу разобраться.LoaderManager не принимает 'this'

Я следую курсу Udacity на Основах Android и должен выяснить, как загружать данные с помощью Loader. Однако, когда я использую следующую строку, то «это» подсвечивается красным и показывает следующее сообщение об ошибке:

Wrong 3rd argument type. Found 'com.example.carl.latestnews.MainActivity', required: 'android.app.LoaderManager.LoaderCallbacks<java.lang.Object> 

Я гугле, многоярусные и попытался предложение я нашел. Я попытался создать внутренний класс, который реализует обратные вызовы. Я ударил кирпичную кладку, и я сидел здесь, царапая себе голову, пытаясь понять, что мне не хватает!

Может ли кто-нибудь сказать мне, что я здесь делаю неправильно?

Заранее благодарен!

package com.example.carl.latestnews; 


import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.AsyncTaskLoader; 
import android.support.v4.content.Loader; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.ListView; 
import android.widget.TextView; 
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<ArrayList<ArticleObject>> { 

    // ArticleObject is a custom object which contains a headline, date, category etc of a news article 

    // URL for Guardian API including API Key 
    final static String GUARDIAN_API_URL = "https://content.guardianapis.com/search?"; 

    // API Key 
    final static String GUARDIAN_API_KEY = "test"; 

    // ID for LoaderManager 
    final static int LOADER_MANAGER_ID = 0; 


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

     // Get or initialize loader manager 
     getLoaderManager().initLoader(LOADER_MANAGER_ID, null, this); 

    } 

    @Override 
    public Loader<ArrayList<ArticleObject>> onCreateLoader(int id, Bundle args) { 
     return new dataLoader(); // dataLoader() removed for easy reading 
    } 

    @Override 
    public void onLoadFinished(Loader<ArrayList<ArticleObject>> loader, ArrayList<ArticleObject> data) { 
     /UI Update Code 
    } 

    @Override 
    public void onLoaderReset(Loader<ArrayList<ArticleObject>> loader) { 
     // Reset Code 
    } 




} 
+0

Пожалуйста, измените вопрос и предоставить 'dataLoader' определение класса. – CommonsWare

ответ

1

Этот метод ожидает LoaderCallbacks как аргумент.

Ваша задача должна быть выполнена LoaderCallbacks interface. ИЛИ вы предоставляете анонимное реализацию этого интерфейса, как:

LoaderManager.LoaderCallbacks callbacks = new LoaderManager.LoaderCallbacks() { 
     @Override 
     public Loader onCreateLoader(int id, Bundle args) { 
      return null; 
     } 

     @Override 
     public void onLoadFinished(Loader loader, Object data) { 

     } 

     @Override 
     public void onLoaderReset(Loader loader) { 

     } 

    getLoaderManager().initLoader(LOADER_MANAGER_ID, null, callback); 

Реализация методов интерфейса зависит от вас, хотя, этот код не будет работать сразу.

+0

Привет Аскорбин. Я пробовал выше, но аргумент обратного вызова в последней строке подсвечивается и показывает ту же ошибку ??? – Caphson

+0

@ Caphson. Вы должны уточнить, что такое ошибка. Обратите внимание, что существуют разные версии большинства материалов загрузчика (нормальный и v4), проверьте импорт, если что-то перепутано. – FWeigl

5

Изменить:getLoaderManager() - getSupportLoaderManager();
Как это:
getLoaderManager().initLoader(ID_FAVORITE_METAINFO_LOADER, args, this);
Для
getSupportLoaderManager().initLoader(ID_FAVORITE_METAINFO_LOADER, args, this);

+0

Спасибо, я делаю тот же курс, что и OP. Изменение 'getLoaderManager' на' getSupportLoaderManager' разрешило мою проблему. – jungledev