Search code examples
androidsearchandroid-loadermanager

Can't use "this" as an argument in the getLoaderManager().initLoader() method


Instead of using some of the deprecated SimpleCursorAdapter constructors, many people have suggested to use LoaderManager and CursorLoader. So when calling getLoaderManager().initLoader() it gives me this error:

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

I have tried importing the v4 version of the loadermanager and cursorloader, but that has not seem to work. I have also tried the getSupportLoaderManager(), which doesn't work as well. I noticed that some people are getting this error and have looked through the conversation to try and find solutions, but the ones I have found don't work. I am calling the LoaderManager within the showResults() method btw

Code for searchable activity:

import android.os.Bundle;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.app.SearchManager;
import android.app.ListActivity;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleCursorAdapter;
import android.content.Context;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
public class SearchResultsActivity extends FragmentActivity {

private ListView list;
DatabaseTable db;
LoaderManager lm;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_results);
    db = new DatabaseTable(this);
    handleIntent(getIntent());
}

public void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
     if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        showResults(query);
    }

}

private void showResults(String query) {
    db = new DatabaseTable(this);
    Cursor cursor = db.getContactMatches(query, null);
    list = (ListView)findViewById(android.R.id.list);
    getSupportLoaderManager().initLoader(0, null, this);
    SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, 
            null, new String[] {DatabaseTable.COL_NAME}, new int[] {android.R.id.text1}, 0);
    list.setAdapter(mAdapter);
    list.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent contactIntent = new Intent(getApplicationContext(), ContactActivity.class);
            contactIntent.setData(getIntent().getData());
            startActivity(contactIntent);
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

 // Associate searchable configuration with the SearchView
    SearchManager searchManager =
           (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
            (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));
    return true;

}

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.search:
                onSearchRequested();
                return true;
            default:
                return false;
        }
    }

}


Solution

  • The method initLoader(int, Bundle, LoaderManager.LoaderCallbacks) in the type LoaderManager is not applicable for the arguments (int, null, SearchResultsActivity)

    Simply put: SearchResultsActivity must implement LoaderManager.LoaderCallbacks. Otherwise this doesn't refer to an instance of LoaderManager.LoaderCallbacks...