Вопрос по android-listfragment, sqlite, android, android-loadermanager – getLoaderManager (). initLoader () не принимает «this» в качестве аргумента, хотя класс (ListFragment) реализует LoaderManager.LoaderCallbacks <Cursor>

61

У меня возникли проблемы сруководство по использованию SQLite в Android. Я используюListFragment вместоListActivity(как в примере), поэтому у меня естьListFragment воплощать в жизнь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>.

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

pastebin.com/284e26tT filldata() находится в конце файла. Я изменил название пакета. Я также, вероятно, должен был упомянуть, что использую ActionBarSherlock. vurp0
Вставьте свой полный код. Vipul Shah

Ваш Ответ

15   ответов
0

Try these 2 lines it will work

anager();

loaderManager.initLoader(LOADER_ID, null,  this);
3

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

и использовать

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

Вы не используете правильные реализацииCursorLoader а такжеLoader. Remove your old imports and use these ones:

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 нет никакого методаgetSupportLoadManager().

Есть идеи по этому поводу?

РЕДАКТИРОВАТЬ: следоватьэтот урок если вы не знаете, как использовать фрагменты. Создайте новый класс с расширением SherlockFragment и переместите туда свою логику отображения. Сделайте ваше старое действие расширенным SherlockFragmentActivity и покажите вновь созданный SherlockFragment. Таким образом, я получил это работает. Спасибо @JakeWharton!

@ JakeWharton будет ли такой класс, как SherlockFragmentListActivity ???
setContentView(android.R.layout.list_content) и у тебя волшебно то же самое!
Полностью забыл, у меня был открытый вопрос здесь, но это была проблема! Спасибо! vurp0
@JakeWharton, с какой версии существует макет list_content? Или это макет ListActivity по умолчанию? Когда я добавляю его в свой ListActivity, он выдает ошибку,list_content не может быть решен. Целевая версия 16, минимальная версия 8.
SherlockListActivity продолжаетсяListActivity, Фрагменты поддержки и загрузчики являются частью библиотеки поддержки, что означает, что вам нужно расширитьFragmentActivity (или жеSherlockFragmentActivity).
1

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

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

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

// 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);
}
2

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

я пытался привести как @Dexter предложить, но это выдало ошибку, сказавcannot be cast to android.app.LoaderManager$LoaderCallbacksПоэтому я попытался использовать различные операторы импорта, и это сработало. Я закомментировалv4 версии, и это то, что у меня сейчас, и приложение работает:

//import android.support.v4.app.LoaderManager;
import android.app.LoaderManager;
import android.support.v4.app.NavUtils;
//import android.support.v4.content.CursorLoader;
import android.content.CursorLoader;
//import android.support.v4.content.Loader;
//import android.content.Loader;

Не совсем уверен, когда / какv4 версии были импортированы.

1

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

Так что я на самом делеnever вызвал .initLoader и просто сразу вызвал .restartLoader.

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

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

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

2

чтобы моя активность расширяла ActionBarActivity из пакета android.support.v7.app. Я был тогда в состоянии использовать

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

3


если вы используете загрузчик менеджер во фрагменте, и вы мин api ниже HONEYCOMB
Вы должны использовать этот импорт

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*/);

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

0

ользовать 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, который, в свою очередь, загружает YourListFragment.java

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

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

0

поэтому я не могу использовать пакет android.support.v4.

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

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

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

getActivity().getSupportLoaderManager().initLoader(1, null, YourActivity.this);

я надеюсь, что это полезно для вас

0

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

Go to settings and enable imports on the fly option.(by default it'll be enabled and you can do this by using Alt+Enter keys).

Cut the whole code of the activity which had implemented
LoaderCallback... and paste it in a text editor.

Then at last copy the whole code of that activity from the text editor where you had pasted, without any import commands.( Only the code of the class/activity).

You'll get lots of errors as you have imported nothing yet. Just press Alt+Enter wherever you're getting the errors and it's libraries will be imported automatically. Note : Choose android.app... library for CursorLoaders.

8

от

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

в

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

Замечания:

minSdk was 8 and i was using support library v4. (android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this) did not work. getSupportLoaderManager() or getSupportLoadManager() did not work. This code was inside activity not fragment
Мой minSdk равен 27, и если я это делаю, я получаю ошибку: & quot; невозможно привести к android.app.LoaderManager $ LoaderCallbacks & quot;
Я запустил код, и он рухнул, и трассировка стека вернулась к этой строке кода.
И это сработало для меня :) Вы также проверили другие детали, как я упомянул в комментарии? Хорошо, что трассировка стека вернулась к этой строке кода. Но что это сказал? Не могли бы вы поделиться этим?
@chowey, что заставило вас сделать вывод, что исключение было из этого куска кода? Многие разработчики, включая меня, успешно выполнили его. Вы проверили lib & amp; SDK версия и т.д., также?
Это создает исключение RuntimeException для меня, и я не вижу, как оно могло бы работать, если только оно никогда не будет выполнено.
59

на которые стоит обратить внимание (из моего недавнего опыта борьбы с этим):

If your minSDK is set to less than 11 (i.e. level 10 for Gingerbread) and you are using the Support Pack for backward compatibility, make sure you use

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

You mentioned this when you said you are using ListFragment, but it bears repeating: Do not extend Activity, otherwise the support package will not work. Instead, extend the FragmentActivity class or the ListFragment class.

For your imports, make sure you are using the correct versions if your minSDK < 11:

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

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

Очень полезно, спасибо!
Я добавил библиотеку поддержки v4, но, к сожалению, я все еще не получил getSupprtLoaderManager, мне пришлось добавить библиотеку actionbarsherlock и расширить SherlockFragmentActivity
если я расширяю класс с помощью ACTVITY, то это будет неправильно, потому что у меня также возникает такая же проблема при запуске загрузчика
Ангел еще бродит по земле, спасибо!

Похожие вопросы