Search code examples
javaandroidfilteradaptersearchview

Filter fragment adapter from action bar


Edited...

I am trying to filter an adapter from a search view. I know what I have is close, but not quite there. I am getting this error message, with the code below.

LogCat

W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x40f0f2a0)
E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at ---$FreeAgentPagerAdapter.getCount(---.java:403)
    at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:813)
    at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2688)
    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276)
    at ---$FreeAgentPagerAdapter$1.publishResults(---.java:434)

SearchView

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.in_game, menu);

    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) searchItem.getActionView();
    setupSearchView(searchItem);

    if (mState == 0) {
        menu.findItem(R.id.action_search).setVisible(false);
    }

    return true;
}

private void setupSearchView(MenuItem searchItem) {

    if (isAlwaysExpanded()) {
        mSearchView.setIconifiedByDefault(false);
    } else {
        searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    }

    mSearchView.setOnQueryTextListener(this);
}

String newText = "";
public boolean onQueryTextChange(String newText) {
    Toast.makeText(getBaseContext(), "Query = " + newText, Toast.LENGTH_SHORT).show();
    return false;
}

public boolean onQueryTextSubmit(String query) {
    Adapter.getFilter().filter(newText.toString());
    return false;
}

protected boolean isAlwaysExpanded() {
    return false;
}

Adapter

public class AdapterFragment extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment, container, false);
        ViewPager = (ViewPager) rootView.findViewById(R.id.Pager);
        Adapter = new PagerAdapter(getChildFragmentManager());
        ViewPager.setAdapter(Adapter);
        return rootView;
    }
}

public class PagerAdapter extends FragmentStatePagerAdapter {

    private List TITLES = new ArrayList();

    private Map ReferenceMap;

    public PagerAdapter(FragmentManager fm) {
        super(fm);

        ReferenceMap = new HashMap();

        TEST.add("TESTING");
        for (Test test : test.getTest()) {
            TEST.add(test.getTest());
        }
    }

    @Override
    public CharSequence getTitle(int i) {
        return TEST.get(i);
    }

    @Override
    public int getCount() {
        return TEST.size();
    }

    @Override
    public Fragment getItem(int i) {
        Fragment Fragment = Fragment.newInstance(test.getId(), TEST.get(i));
        ReferenceMap.put(i, (Fragment) Fragment);
        return Fragment;
    }

    public FiltaddDropFragmentlter() {
        return new Filter() {
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                Toast. makeText(getBaseContext(), "Publishing " + constraint, Toast.LENGTH_LONG).show();
                TEST = (List<String>) results.values;
                Adapter.notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                Toast.makeText(getBaseContext(), "Filtering " + constraint, Toast.LENGTH_LONG).show();
                List<String> filteredResults = getFilteredResults(constraint);

                FilterResults results = new FilterResults();
                results.values = filteredResults;

                return results;
            }
        };
    }

}

private List<String> getFilteredResults(CharSequence constraint) {
    return null;
}

Would anyone be able to point out what I'm doing wrong? I think I just need a second pair of eyes to look this over. What should I be doing differently and how can I do this the best way?


Solution

  • Three steps:

    1. Make a new class (or perhaps a static inner class in your adapter) that extends Filter. Implement the performFiltering() method.
    2. Implement the publishResults() method to exchange your list data and call notifyDataSetChanged() on your adapter
    3. Make your adapter implement the Filterable interface and define the getFilter() method. It should return an instance of your new filter class that you made in step 1.

    performFiltering will be processed on a background thread, and publishResults will be called from the UI thread.

    I'm looking for the sample code that helped me learn list filtering. If I find it I'll post a link.