Search code examples
androidsearchview

How to implement search on simple cursor adapter?


In my application. I want to implement searchview which is placed in action bar. And I am using simple cursor adapter. There are one imageview and one textview in the simple cursor adapter. I want to implement search on the basis of textview content. But I got null pointer exception.

my simple cursor adapter :

 SimpleCursorAdapter c_adapter = new SimpleCursorAdapter(getActivity(), R.layout.contact_item, mCursor,
        new String[]{ContactsContract.Contacts.DISPLAY_NAME
                , ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, ContactsContract.Contacts._ID},

        new int[]{R.id.username1, R.id.ivuserpicicon1});

And I get error in :

c_adapter.getFilter().filter(newText);

Solution

  • For this we have to use setfilterqueryprovider() and use required query for the selection on particular column.

    public class MainActivity extends ActionBarActivity {
    
        ListView listview;
        SimpleCursorAdapter c_adapter;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Cursor mCursor = getContacts();
            c_adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.contact_item, mCursor,
            new String[]{ContactsContract.Contacts.DISPLAY_NAME
                , ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, ContactsContract.Contacts._ID},
            new int[]{R.id.username1, R.id.ivuserpicicon1});
    
            listview = (ListView) findViewById(R.id.listview);
            listview.setAdapter(c_adapter);
    
            c_adapter.setFilterQueryProvider(new FilterQueryProvider() {
                public Cursor runQuery(CharSequence constraint) {
                    return getCursor(constraint.toString());
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu){
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.menu_main, menu);
            SearchManager SManager =  (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            MenuItem searchMenuItem = menu.findItem(R.id.action_search);
            android.support.v7.widget.SearchView searchViewAction = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchMenuItem);
            searchViewAction.setSearchableInfo(SManager.getSearchableInfo(getComponentName()));
            searchViewAction.setIconifiedByDefault(true);
    ////////////////////////////////////////////////////////////////////////////////////
            android.support.v7.widget.SearchView.OnQueryTextListener textChangeListener = new android.support.v7.widget.SearchView.OnQueryTextListener()
            {
                @Override
                public boolean onQueryTextChange(String newText)
                {
                    c_adapter.getFilter().filter(newText);
                    System.out.println("on text chnge text: " + newText);
                    return true;
                }
                @Override
                public boolean onQueryTextSubmit(String query)
                {
                    c_adapter.getFilter().filter(query);
                    System.out.println("on query submit: "+query);
                    return true;
                }
            };
            searchViewAction.setOnQueryTextListener(textChangeListener);
    ///////////////////////////////////////////////////////////////////////////////////////
            return super.onCreateOptionsMenu(menu);
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case R.id.action_search:
                //openSearch();
                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }
    
        private Cursor getContacts() {
            // Run query
            Uri uri = ContactsContract.Contacts.CONTENT_URI;
            String[] projection = new String[]{ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, ContactsContract.Contacts._ID};
            String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP+" = "+
                 1  +" AND "+ ContactsContract.Contacts.HAS_PHONE_NUMBER +" = "+ 1;
            String[] selectionArgs = null;
            String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                + " COLLATE LOCALIZED ASC";
            return getContentResolver().query(uri, projection, selection, selectionArgs,
                sortOrder);
        }
    
        private Cursor getCursor(String str) {
            Cursor mCursor = null;
            if (str == null  ||  str.length () == 0)  {
                mCursor = getContacts();
            }
            else {
                Uri uri = ContactsContract.Contacts.CONTENT_URI;
                String[] projection = new String[]{ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, ContactsContract.Contacts._ID};
                String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = " +
                1 + " AND " + ContactsContract.Contacts.HAS_PHONE_NUMBER + " = " + 1 + " AND " + ContactsContract.Contacts.DISPLAY_NAME + " like '" + str + "%'";
            String[] selectionArgs = null;
            String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
                + " COLLATE LOCALIZED ASC";
            mCursor = getContentResolver().query(uri, projection, selection, selectionArgs,
                sortOrder);
            }
    
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
    
            return mCursor;
        }
    }