Implement Searchview with Navigation Drawer and Fragment inside

醉酒当歌 提交于 2019-12-02 09:07:22

Assuming that you have added searchable.xml into res/xml/ project directory and in your AndroidManifest.xml, you have declared the MainActivity as searchable activity.

1. Add menu.xml into res/menu folder containing menu item that uses SearchView using app:actionViewClass="android.support.v7.widget.SearchView"

<item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_action_search"
    android:title="@string/search_hint"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.support.v7.widget.SearchView" />

2. Setup SearchView and add SearchView.setOnQueryTextListener to your MainActivity.

3. Ony add a static Filter function into your Fragment class. For example:

    public static void doFilter(String searchQuery) {
        ...........
        ....................
    }

Update your MainActivity as below:

public class MainActivity extends AppCompatActivity {

    Context mContext;

    // Default active navigation menu
    int mActiveMenu;

    // TAGS
    public static final int MENU_FIRST = 0;
    public static final int MENU_SECOND = 1;

    // Action bar search widget
    SearchView searchView;
    String searchQuery = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;

        ................
        ...........................

        // FirstFragment will show when app launch
        mActiveMenu = MENU_FIRST;
        displayViewWithFragment(mActiveMenu);

        // NavigationView
        mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId())
                {
                    case R.id.navigation_item_first:
                    {
                        // First
                        displayViewWithFragment(MENU_FIRST);

                        return true;
                    }
                    case R.id.navigation_item_second:
                    {
                        // Second
                        displayViewWithFragment(MENU_SECOND);

                        return true;
                    }
                    default:
                        return true;
                }
            }
        });
    }

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

        // Getting search action from action bar and setting up search view
        MenuItem searchItem = menu.findItem(R.id.action_search);
        searchView = (SearchView)searchItem.getActionView();

        // Setup searchView
        setupSearchView(searchItem);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Handle action bar actions click
        switch (item.getItemId())
        {
            case R.id.action_search:
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    // Search widget
    private void setupSearchView(MenuItem searchItem)
    {
        SearchManager searchManager = (SearchManager) this.getSystemService(Context.SEARCH_SERVICE);
        if (searchManager != null)
        {
            SearchableInfo info = searchManager.getSearchableInfo(getComponentName());
            searchView.setSearchableInfo(info);
        }

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextChange(String newText)
            {
                searchQuery = newText;

                // Load search data on respective fragment
                if(mActiveMenu == MENU_FIRST)   // First
                {
                    FirstFragment.doFilter(newText);
                }
                else if(mActiveMenu == MENU_SECOND) // Second
                {
                    SecondFragment.doFilter(newText);
                }
                return true;
            }

            @Override
            public boolean onQueryTextSubmit(String query) {
                //searchView.clearFocus();
                return false;
            }
        });

        // Handling focus change of search view
        searchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                // Focus changed after pressing back key or pressing done in keyboard
                if (!hasFocus) {
                    searchQuery = "";
                }
            }
        });
    }

    /**
     * Displaying fragment view for selected nav drawer list item
     * */
    private void displayViewWithFragment(final int position) {

        // Active menu
        mActiveMenu = position;

        Fragment fragment = null;
        switch (position)
        {
            case MENU_FIRST:
            {
                // First
                fragment = new FirstFragment();
            }
            break;

            case MENU_SECOND:
            {
                // Second
                fragment = new SecondFragment();
            }
            break;

            default:
                break;
        }

        if (fragment != null)
        {
            mFragmentTransition = getSupportFragmentManager().beginTransaction();
            mFragmentTransition.replace(R.id.frame_container, fragment);
            mFragmentTransition.commit();
        }
    }
}

Add filter function to FirstFragment:

public static void doFilter(String searchQuery)
{
    // Filter codes here
    ...................
    .............................

    // Update RecyclerView
    adapter.notifyDataSetChanged();
}

Hope this will help~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!