web-dev-qa-db-ja.com

クラス(ListFragment)はLoaderManager.LoaderCallbacks <Cursor>を実装していますが、getLoaderManager()。initLoader()は引数として「this」を受け入れません

AndroidでSQLiteを使用する際に ガイド を追跡するのに問題があります。 (例のように)ListFragmentの代わりにListActivityを使用しているため、代わりにListFragmentが_LoaderManager.LoaderCallbacks<Cursor>_を実装しています。次に、ListFragmentfillData()メソッドで:

_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>_を実装していても、マークされた行に。

アイデアをありがとう。

63
vurp0

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を拡張する必要があるため、getSupportLoadManager()というメソッドはありません。

これに関するアイデアはありますか?

編集:フラグメントの使用方法がわからない場合は このチュートリアル に従ってください。 SherlockFragmentを拡張して新しいクラスを作成し、表示ロジックをそこに移動します。古いアクティビティでSherlockFragmentActivityを拡張し、新しく作成されたSherlockFragmentを表示します。このように私はそれを機能させました。 @JakeWhartonに感謝します!

82
Matthias B

注意すべきいくつかの点(これと戦っている私の最近の経験から):

  1. MinSDKが11未満(つまり、Gingerbreadのレベル10)に設定されており、下位互換性のためにSupport Packを使用している場合は、必ず

    getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
  2. ListFragmentを使用していると言ったときにこれについて言及しましたが、繰り返します。Activityを拡張しないでください。そうしないと、サポートパッケージが機能しません。代わりに、FragmentActivityクラスまたはListFragmentクラスを拡張します。

  3. インポートでは、minSDK <11の場合、正しいバージョンを使用していることを確認してください。

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

これがあなたに役立つことを願っています...または少なくとも誰か...

59
wileyCoyote

3番目の引数をキャストすると、私の場合の問題は解決しました。

から

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

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

注意:

  1. minSdkは8で、サポートライブラリv4を使用していました。
  2. _(Android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)_は機能しませんでした。
  3. getSupportLoaderManager() or getSupportLoadManager()は機能しませんでした。
  4. このコードはフラグメントではなくアクティビティ内にありました
9
Dexter

インポートを変更

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

そして使用する

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

それは遅いですが、おそらくいくつかを助けます。
フラグメントでローダーマネジャーを使用し、最小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*/);

これが何らかの助けになることを願っています。

3
max

私の場合、アクティビティでAndroid.support.v7.appパッケージのActionBarActivityを拡張する必要がありました。その後、使用することができました

getSupportLoaderManager()。initLoader(0、null、this);

2
Oladipo Olasemo

私のエラーはこれが原因でした:

//import Android.app.ListFragment; Error when doesnt import from support.v4
import Android.support.v4.app.ListFragment;
2
Renan Franca

私は自分のアプリで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);
}
1
brentil

AsyncTaskLoaderがリストを返さないという同様の問題がありましたが、解決策は、呼び出しを.initLoaderから.restartLoaderに変更することでした。

したがって、実際にはnever .initLoaderと呼ばれ、すぐに.restartLoaderと呼ばれます。

フラグメントにonListItemClickリスナーがあり、フラグメントからバックアウトされるたびにonListItemClickをリロードし、アプリをナビゲートしてクラッシュし続けました。

それは私のアプリに固有のものかもしれませんが、フラグメントバックスタックリロードの問題が発生している場合、他の人に役立つことを願っています。

これはアプリのファイルマネージャー部分の一部であったため、ロードするフラグメント内の複数のonListItemClicksをクリックすることに固有です。

1

長い犠牲を払った後、フラグメントを使用している場合はこのソリューションを使用し、このコードを使用します。

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

これがあなたのお役に立てば幸いです

0
Bilal Qasim

私はminSDK 27を使用しており、同じ問題があり、@ Dexter Suggestのようにキャストしようとしましたが、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バージョンがいつ/どのようにインポートされたかはわかりません。

0
thehme

同じ問題に遭遇しました。私のminSdkVersionは14なので、Android.support.v4パッケージを使用できません。

LoaderManager.LoaderCallbacksの代わりにLoaderCallbacksを拡張し、これらのパッケージを使用することで考え出した

import Android.app.LoaderManager.LoaderCallbacks;  
import Android.content.CursorLoader;  
import Android.database.Cursor;  
import Android.widget.SimpleCursorAdapter;
0
Dino Tw

この2行を試してみてください

Android.support.v4.app.LoaderManager loaderManager = getSupportLoaderManager();

loaderManager.initLoader(LOADER_ID, null,  this);
0
tarun mittal

これを回避するには、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レイアウトを使用するよう指示するだけで、YourListFragment.Javaがロードされます。

その後、次を使用できます。YourListFragment.JavaのgetSherlockActivity().getSupportLoaderManager().initLoader(...)

これが正しいアプローチであるかどうかはわかりませんが、すべてのロジックをフラグメントに保持しています。これは素晴らしいことです。

0
Joony

上記のすべての方法を試しても、「this」パラメーターで同じエラーが発生する場合は、次の手順を実行します。

  1. 設定に移動し、オンザフライのインポートオプションを有効にします(デフォルトでは有効になり、Alt + Enterキーを使用してこれを行うことができます)。

  2. 実装したアクティビティのコード全体をカットします
    LoaderCallback ...をテキストエディターに貼り付けます。

  3. 最後に、インポートコマンドなしで、貼り付けたテキストエディターからそのアクティビティのコード全体をコピーします(クラス/アクティビティのコードのみ)。

  4. まだ何もインポートしていないため、多くのエラーが発生します。エラーが発生している場所でAlt + Enterを押すだけで、ライブラリが自動的にインポートされます。注:CursorLoadersにはAndroid.app ...ライブラリを選択してください。

0
Saurabh Singh