65

Android での SQLite の使用に関するガイドに従うのに問題があります。(例のように) a のListFragment代わりに aを使用しているので、代わりに実装しています。次に、 のメソッドで:ListActivityListFragmentLoaderManager.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>

アイデアをありがとう。

4

19 に答える 19

84

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()

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

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

于 2012-07-11T18:47:01.977 に答える
10

私の場合、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. このコードはフラグメントではなくアクティビティ内にありました
于 2014-06-18T06:21:35.353 に答える
4

遅くなりましたが、誰かを助けるかもしれません。
ローダーマネージャーをフラグメントで使用していて、最小 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*/);

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

于 2016-06-20T11:47:04.297 に答える
2

私の場合、Activity で android.support.v7.app パッケージから ActionBarActivity を拡張する必要がありました。その後、使用できました

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

于 2015-06-24T22:28:16.777 に答える
2

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

//import android.app.ListFragment; Error when doesnt import from support.v4
import android.support.v4.app.ListFragment;
于 2014-10-01T13:47:21.247 に答える
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);
}
于 2013-02-02T16:52:16.393 に答える
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 レイアウトを使用するように指示するだけで、YourListFragment.java がロードされます。

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

これが正しいアプローチかどうかはわかりませんが、すべてのロジックが Fragments に保持されます。これは素晴らしいことです。

于 2013-01-21T14:38:19.650 に答える
0

同じ問題に遭遇しました。私の 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;
于 2013-11-15T01:13:51.540 に答える
0

initLoader()アクティビティ内で呼び出そうとしていました。私にとってこれはうまくいきました

変化

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

getLoaderManager().initLoader(LOADER_ID,null,this);
于 2020-01-05T07:21:17.477 に答える