Как удалить пространство скрытого элемента из окна навигации при скрытии элемента меню? - PullRequest
0 голосов
/ 11 января 2019

У меня есть SearchView для поиска в ящике навигации, он скрывает элементы, которые не соответствуют критериям поиска, проблема в том, что пространства скрытых элементов все еще там. Как я могу удалить эти пробелы? До поиска:

enter image description here

После поиска: enter image description here

Код SearchView onQueryTextListener

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

        //Add Listener to SearchView when the Drawer is opened by first time
        @Override
        public void onDrawerOpened(View view) {
            if(searchView != null) return;

            searchView = (SearchView) findViewById(R.id.dw_searchv);
            searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String s) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String s) {
                    //Access to menu items container
                    NavigationMenuView containerOfMenuItems = ((NavigationMenuView)((NavigationView)drawer.getChildAt(1)).getChildAt(0));
                    int options = containerOfMenuItems.getChildCount();

                    //Iterate the container of menu items
                    for(int i=0; i<options; i++){
                        Object menuItem = containerOfMenuItems.getChildAt(i);

                        //Verify that the Child of container, is an menu item
                        if(menuItem.getClass() == NavigationMenuItemView.class) {
                            String titleOfMenuItem = ((AppCompatCheckedTextView)((NavigationMenuItemView) menuItem).getChildAt(0)).getText().toString();
                            if(titleOfMenuItem.toLowerCase().contains(s.toLowerCase()))
                                ((NavigationMenuItemView) menuItem).setVisibility(View.VISIBLE);
                            else {
                                ((NavigationMenuItemView) menuItem).setVisibility(View.INVISIBLE);

                            }
                        }
                    }
                    return false;
                }
            });
        }
    };

PD: View.GONE у меня не работает

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Не пытайтесь изменять виды, составляющие NavigationView, вместо этого используйте меню, которое поддерживает его:

// a field in your activity
private List<MenuItem> menuItems = new ArrayList<>();

В вашем методе onCreate () сохраните ссылку на начальный список MenuItems:

//...
NavigationView nav = findViewById(R.id.yourNavViewId);
navMenu = nav.getMenu();
for (int i = 0; i < navMenu.size(); i++) {
    menuItems.add(navMenu.getItem(i));
}

Затем в методе onQuery используйте этот список:

@Override
public boolean onQueryTextChange(String s) {
   NavigationView nav = findViewById(R.id.yourNavViewId); 
   nav.getMenu().clear();
   for (int i = 0; i < menuItems.size(); i++) {
       MenuItem menuItem = menuItems.get(i);
       if (menuItem.getTitle().toString().toLowerCase().contains(newText.toLowerCase()))
          nav.getMenu().add(0, menuItem.getItemId(), 0, menuItem.getTitle());
       }
}
0 голосов
/ 11 января 2019

Вы должны добавить код, чтобы показать, что вы используете в любом случае вы можете сделать следующее для вашего дела

  1. Вы можете создать два списка, один для searchResult и один для allData
  2. если вы хотите данные результатов поиска, поместите список searchResult в массив использовать адаптер notifyDataSetChanged
  3. если вы хотите, чтобы все просмотры, подобные вам, отменили поиск, вставьте список всех данных. в массиве адаптера и используйте метод адаптера notifyDataSetChanged.
...