Javier Perez
Javier Perez

Reputation: 11

How to implement search widget with a listview using SherlockActionbar?

So, I'm trying to implement this code (https://stackoverflow.com/a/14085524/2213992) on my application but no success so far.

This is my MainActivity.java:

import java.util.List;

import android.app.SearchManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.SearchView;

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockListActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;

public class MainActivity extends SherlockListActivity implements
// public class MainActivity extends ListActivity implements
        ActionBar.TabListener {
    private List<Scos> scoss;
    ScosDataSource datasource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        datasource = new ScosDataSource(this);
        datasource.open();
        scoss = datasource.findAll();
        if (scoss.size() == 0) {
            createData();
            scoss = datasource.findAll();
        }
        refreshDisplay();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getSupportMenuInflater().inflate(R.menu.options, menu);

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.menu_search)
                .getActionView();
        if (null != searchView) {
            searchView.setSearchableInfo(searchManager
                    .getSearchableInfo(getComponentName()));
            searchView.setIconifiedByDefault(false);
        }

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {

            public boolean onQueryTextChange(String newText) {
                // this is your adapter that will be filtered
                adapter.getFilter().filter(newText);
                return true;
            }

            public boolean onQueryTextSubmit(String query) {
                // this is your adapter that will be filtered
                adapter.getFilter().filter(query);
                return true;
            }
        };
        searchView.setOnQueryTextListener(queryTextListener);

        return super.onCreateOptionsMenu(menu);

        // return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            return (true);
        }
        return (super.onOptionsItemSelected(item));
    }

    public void refreshDisplay() {

        ArrayAdapter<Scos> adapter = new ScosListAdapter(this, scoss);
        setListAdapter(adapter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        datasource.open();
    }

    @Override
    protected void onPause() {
        super.onPause();
        datasource.close();

    }

    private void createData() {
    }

}

This my option.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item
    android:id="@+id/menu_search"
    android:actionViewClass="com.actionbarsherlock.widget.SearchView"
    android:showAsAction="ifRoom|collapseActionView"
    android:icon="@drawable/ic_action_search"
    android:title="@Search">
</item>

</menu>

Thanks for your help in advance.

Javier

Upvotes: 1

Views: 4544

Answers (1)

Javier Salinas
Javier Salinas

Reputation: 657

I hope that it would help because I had the same problem.

To use the adapter the best way is that the class implements SearchView.OnQueryTextListener and then you don´t have to create the inner class and you will have the adapter.

In your code will be something as:

public class MainActivity extends SherlockListActivity implements SearchView.OnQueryTextListener

and then in the class you have to define the methods. The adapter will be the adapter that you have in your class ArrayAdapter adapter. But you should define it as private in the class.

public boolean onQueryTextChange(String newText) {
    // this is your adapter that will be filtered
    adapter.getFilter().filter(newText);
    return true;
}

public boolean onQueryTextSubmit(String query) {
    // this is your adapter that will be filtered
    adapter.getFilter().filter(query);
    return true;
}

In the line where you are setting:

 searchView.setOnQueryTextListener(queryTextListener);

Should be:

 searchView.setOnQueryTextListener(this);

If you have any problem let me know, I was with a similar problem today and read your question without answer.

Upvotes: 1

Related Questions