AndroidでSQLiteを使用する際に ガイド を追跡するのに問題があります。 (例のように)ListFragment
の代わりにListActivity
を使用しているため、代わりにListFragment
が_LoaderManager.LoaderCallbacks<Cursor>
_を実装しています。次に、ListFragment
のfillData()
メソッドで:
_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>
_を実装していても、マークされた行に。
アイデアをありがとう。
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に感謝します!
注意すべきいくつかの点(これと戦っている私の最近の経験から):
MinSDKが11未満(つまり、Gingerbreadのレベル10)に設定されており、下位互換性のためにSupport Packを使用している場合は、必ず
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
ListFragmentを使用していると言ったときにこれについて言及しましたが、繰り返します。Activityを拡張しないでください。そうしないと、サポートパッケージが機能しません。代わりに、FragmentActivityクラスまたはListFragmentクラスを拡張します。
インポートでは、minSDK <11の場合、正しいバージョンを使用していることを確認してください。
Android.support.v4.app.FragmentActivity;
Android.support.v4.app.LoaderManager;
Android.support.v4.content.Loader;
これがあなたに役立つことを願っています...または少なくとも誰か...
3番目の引数をキャストすると、私の場合の問題は解決しました。
から
_ getLoaderManager().initLoader(0, null, this);
_
に
_ getLoaderManager().initLoader(0, null, (Android.app.LoaderManager.LoaderCallbacks<Cursor>) this);
_
注意:
(Android.support.v4.app.LoaderManager.LoaderCallbacks<Cursor>) this)
_は機能しませんでした。getSupportLoaderManager() or getSupportLoadManager()
は機能しませんでした。インポートを変更
import Android.support.v4.app.Fragment;
import Android.support.v4.app.LoaderManager;
import Android.support.v4.content.Loader;
そして使用する
getSupportLoaderManager().initLoader(0, null, this);
それは遅いですが、おそらくいくつかを助けます。
フラグメントでローダーマネジャーを使用し、最小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*/);
これが何らかの助けになることを願っています。
私の場合、アクティビティでAndroid.support.v7.appパッケージのActionBarActivityを拡張する必要がありました。その後、使用することができました
getSupportLoaderManager()。initLoader(0、null、this);
私のエラーはこれが原因でした:
//import Android.app.ListFragment; Error when doesnt import from support.v4
import Android.support.v4.app.ListFragment;
私は自分のアプリで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);
}
AsyncTaskLoaderがリストを返さないという同様の問題がありましたが、解決策は、呼び出しを.initLoaderから.restartLoaderに変更することでした。
したがって、実際にはnever .initLoaderと呼ばれ、すぐに.restartLoaderと呼ばれます。
フラグメントにonListItemClickリスナーがあり、フラグメントからバックアウトされるたびにonListItemClickをリロードし、アプリをナビゲートしてクラッシュし続けました。
それは私のアプリに固有のものかもしれませんが、フラグメントバックスタックリロードの問題が発生している場合、他の人に役立つことを願っています。
これはアプリのファイルマネージャー部分の一部であったため、ロードするフラグメント内の複数のonListItemClicksをクリックすることに固有です。
長い犠牲を払った後、フラグメントを使用している場合はこのソリューションを使用し、このコードを使用します。
getActivity().getSupportLoaderManager().initLoader(1, null, YourActivity.this);
これがあなたのお役に立てば幸いです
私は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
バージョンがいつ/どのようにインポートされたかはわかりません。
同じ問題に遭遇しました。私の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;
この2行を試してみてください
Android.support.v4.app.LoaderManager loaderManager = getSupportLoaderManager();
loaderManager.initLoader(LOADER_ID, null, this);
これを回避するには、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(...)
これが正しいアプローチであるかどうかはわかりませんが、すべてのロジックをフラグメントに保持しています。これは素晴らしいことです。
上記のすべての方法を試しても、「this」パラメーターで同じエラーが発生する場合は、次の手順を実行します。
設定に移動し、オンザフライのインポートオプションを有効にします(デフォルトでは有効になり、Alt + Enterキーを使用してこれを行うことができます)。
実装したアクティビティのコード全体をカットします
LoaderCallback ...をテキストエディターに貼り付けます。
最後に、インポートコマンドなしで、貼り付けたテキストエディターからそのアクティビティのコード全体をコピーします(クラス/アクティビティのコードのみ)。
まだ何もインポートしていないため、多くのエラーが発生します。エラーが発生している場所でAlt + Enterを押すだけで、ライブラリが自動的にインポートされます。注:CursorLoadersにはAndroid.app ...ライブラリを選択してください。