getLoaderManager (). initLoader () не принимает 'this' в качестве аргумента, хотя класс (ListFragment) реализует LoaderManager.LoaderCallbacks <Cursor>

54

У меня возникли проблемы с использованием руководства по использованию SQLite в Android. Я использую ListFragment вместо ListActivity (как в примере), поэтому вместо ListFragment LoaderManager.LoaderCallbacks<Cursor> используется LoaderManager.LoaderCallbacks<Cursor>. Затем в методе fillData() в ListFragment:

private void fillData() {
    // Fields from the database (projection)
    // Must include the _id column for the adapter to work
    String[] from = new String[] { NotesSQLiteHelper.COLUMN_TITLE };
    // Fields on the UI to which we map
    int[] to = new int[] { R.id.label };

    getLoaderManager().initLoader(0, null, this); //error
    adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.notes_row, null, from, to, 0);
    setListAdapter(adapter);
}

Я получаю сообщение об ошибке:

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, NotesActivity.ArrayListFragment)

на отмеченной строке, хотя this реализует LoaderManager.LoaderCallbacks<Cursor>.

Спасибо за любые идеи.

  • 0
    Вставьте свой полный код.
  • 0
    pastebin.com/284e26tT filldata() находится в конце файла. Я изменил название пакета. Я также, вероятно, должен был упомянуть, что я использую ActionBarSherlock.
Теги:
android-loadermanager
android-listfragment

12 ответов

74
Лучший ответ

Вы не используете правильные реализации CursorLoader и Loader. Удалите старый импорт и используйте следующие:

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;

Но у меня есть одна и та же проблема с использованием SherlockActionBar: Поскольку мне нужно расширить SherlockListActivity, метод NO getSupportLoadManager() отсутствует.

Любые идеи по этому поводу?

EDIT: следуйте этот учебник, если вы не знаете, как использовать фрагменты. Создайте новый класс с расширением SherlockFragment и переместите свою логику отображения. Сделайте свою прежнюю деятельность расширенной функцией SherlockFragmentActivity и покажите вновь созданный SherlockFragment. Таким образом, я начал работать. Благодаря @JakeWharton!

  • 15
    SherlockListActivity расширяет ListActivity . Фрагменты поддержки и загрузчики являются частью библиотеки поддержки, что означает, что вам нужно расширить FragmentActivity (или SherlockFragmentActivity ).
  • 0
    Совершенно забыл, у меня был открытый вопрос здесь, но это была проблема! Спасибо!
Показать ещё 6 комментариев
54

Несколько вещей, на которые нужно обратить внимание (из моего недавнего опыта борьбы с этим):

  • Если ваш minSDK установлен менее чем 11 (то есть уровень 10 для Gingerbread), и вы используете пакет поддержки для обратной совместимости, убедитесь, что вы используете

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
  • Вы упомянули об этом, когда сказали, что используете ListFragment, но он повторяет: не увеличивайте активность, иначе пакет поддержки не будет работать. Вместо этого расширьте класс FragmentActivity или ListFragment.

  • Для вашего импорта убедитесь, что вы используете правильные версии, если ваш minSDK < 11:

     android.support.v4.app.FragmentActivity;
     android.support.v4.app.LoaderManager;
     android.support.v4.content.Loader;
    

Надеюсь, это поможет вам... или, по крайней мере, кому-то еще...

  • 0
    Очень полезно, спасибо!
  • 0
    Я добавил библиотеку поддержки v4, но, к сожалению, я все еще не получил getSupprtLoaderManager, мне пришлось добавить библиотеку actionbarsherlock и расширить SherlockFragmentActivity
Показать ещё 2 комментария
7

Отправка третьего аргумента решила проблему в моем случае:

из

 getLoaderManager().initLoader(0, null, this);

к

 getLoaderManager().initLoader(0, null, (android.app.LoaderManager.LoaderCallbacks<Cursor>) this);

Примечание:

  • minSdk было 8, и я использовал библиотеку поддержки v4.
  • (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this) не работает.
  • getSupportLoaderManager() or getSupportLoadManager() не работает.
  • Этот код находился внутри действия, а не фрагмента
  • 2
    Это создает исключение RuntimeException для меня, и я не вижу, как оно могло бы работать, если только оно никогда не будет выполнено.
  • 0
    @chowey, что заставило вас сделать вывод, что Исключение было из этого куска кода? Многие разработчики, включая меня, успешно выполнили его. Вы также проверили версию lib & sdk и т.д.?
Показать ещё 4 комментария
3

Поздно, но, возможно, помогите кому-нибудь. если вы используете загрузчик maneger в фрагменте, а вы min api ниже HONEYCOMB
вы shuld использовать этот импорт

import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;      
import android.support.v4.app.Fragment;

и для запуска загрузчика используйте этот код

getActivity().getSupportLoaderManager().initLoader(/loader stuff*/);

надеюсь, что это поможет кому-то.

2

Измените импорт на

import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;

и используйте

getSupportLoaderManager().initLoader(0, null, this);
2

В моем случае я должен был продлить действие ActionBarActivity из пакета android.support.v7.app. Тогда я смог использовать

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

2

Моя ошибка была beacause this:

//import android.app.ListFragment; Error when doesnt import from support.v4
import android.support.v4.app.ListFragment;
1

Я использую ActionBarSherlock с моим приложением, и я также столкнулся с этой проблемой и проработал все этапы, обсуждаемые другими в этом вопросе. Тем не менее, я продолжал испытывать такую ​​же проблему, пробовав все предлагаемые резолюции.

The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks<D>) in the type LoaderManager is not applicable for the arguments (int, null, this)

Проблема заключалась в том, что я ожидал, что Eclipse скажет мне, когда я что-то упустил, и это говорило мне об этом, но не так, как я привык. Обычно Eclipse в других случаях скажет мне, что мне не хватает переопределений, чтобы что-то работало, но это прямо не говорит об этом. Я, наконец, поднял на "LoaderManager.LoaderCallbacks" вопрос и понял, что у меня не было обратных вызовов, поэтому эта ошибка была действительно очень достоверной ошибкой. Добавление основных переопределений разрешило мою проблему и позволило мне двигаться вперед.

// Creates a new loader after the initLoader () call
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  // do work
  return null;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
  adapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
  // data is not available anymore, delete reference
  adapter.swapCursor(null);
}
0

У меня была аналогичная проблема, когда мой AsyncTaskLoader не возвращал мой список, но я решил изменить вызов с .initLoader на .restartLoader.

Итак, я на самом деле никогда вызывал .initLoader и сразу же вызывал .restartLoader.

У меня был прослушиватель onListItemClick в моем фрагменте, и каждый раз он возвращался из фрагмента и перезагружал onListItemClick и перемещался через приложение, и он продолжал сбой.

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

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

0

Если вы пробовали все вышеперечисленные методы и по-прежнему сталкивались с той же ошибкой с параметром "this", выполните следующие действия:

  • Перейдите к настройкам и включите импорт на лету. (по умолчанию это будет и вы можете сделать это, используя клавиши Alt + Enter).

  • Вырезать весь код действия, которое реализовано
    LoaderCallback... и вставьте его в текстовый редактор.

  • Затем, наконец, скопируйте весь код этого действия из текстового редактора где вы вставили, без каких-либо команд импорта. (Только код класс/активность).

  • У вас будет много ошибок, поскольку вы еще ничего не импортировали. Просто нажмите Alt + Enter, где вы получаете ошибки, и это библиотеки будут импортированы автоматически. Примечание. Выберите библиотеку android.app... для CursorLoaders.

0

Входите в ту же проблему. Моя minSdkVersion - 14, поэтому не может использовать пакет android.support.v4.

Я понял это, расширив LoaderCallbacks вместо LoaderManager.LoaderCallbacks и используя эти пакеты

import android.app.LoaderManager.LoaderCallbacks;  
import android.content.CursorLoader;  
import android.database.Cursor;  
import android.widget.SimpleCursorAdapter;
0

Я обошел это, используя SherlockListFragment (или вы можете использовать ListFragment, я полагаю), но содержал его внутри Activity. Сначала я создал общий класс FragmentHolderActivity, который выглядит следующим образом:

FragmentHolderActivity.java

public class FragmentHolderActivity extends SherlockFragmentActivity {

    public static final String FRAGMENT_LAYOUT_RESOURCE_ID = "fragment_layout_resource_id";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Integer fragmentLayoutResourceId = getIntent().getIntExtra(FRAGMENT_LAYOUT_RESOURCE_ID, Integer.MAX_VALUE);
        Assert.assertNotSame(fragmentLayoutResourceId, Integer.MAX_VALUE);

        setContentView(fragmentLayoutResourceId);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return false;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

}

Затем вам нужно создать XML файл для вашего фрагмента.

your_list_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="com.example.YourListFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/fragment" />

И вот код, который вы используете для запуска фрагмента:

    Intent intent = new Intent();
    intent.setClass(this, FragmentHolderActivity.class);
    intent.putExtra(FragmentHolderActivity.FRAGMENT_LAYOUT_RESOURCE_ID, R.layout.your_list_fragment);
    startActivity(intent);

Вы просто скажете FragmentHolderActivity использовать макет your_list_fragment, который, в свою очередь, загружает MyListFragment.java

Затем вы можете использовать: getSherlockActivity().getSupportLoaderManager().initLoader(...) в YourListFragment.java

Не уверен, что это правильный подход, но он сохраняет мою логику во Фрагментах, что приятно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню