40

I have an application using navigation drawer that provides list of locations. In the drawer, there are several options (like choosing country, city, etc) that user can setup before showing the corresponding list in the main activity.

Is there any possibility to refresh the list when user close the drawer, or maybe there is another way to solve this? I've tried to search for tutorials but found nothing about this drawer closed listener. Any suggestions would be helpful, thanks!

Ren
  • 445
  • 1
  • 4
  • 9

4 Answers4

84

When you setup the ActionBarDrawerToggle you can "implement" the onDrawerClosed and onDrawerOpened callbacks. See the following example from the Docs:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            // Do whatever you want here
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            // Do whatever you want here
        }
    };
// Set the drawer toggle as the DrawerListener
mDrawerLayout.addDrawerListener(mDrawerToggle);

Edit: Now the setDrawerListener is deprecated, use addDrawerListener instead.

Bartando
  • 719
  • 8
  • 26
reVerse
  • 35,075
  • 22
  • 89
  • 84
45

reVerse answer is right in case you are using ActionBar as well. in case you just use the DrawerLayout directly, you can add a DrawerListener to it:

View drawerView = findViewById(R.id.drawer_layout);
if (drawerView != null && drawerView instanceof DrawerLayout) {
    mDrawer = (DrawerLayout)drawerView;
    mDrawer.setDrawerListener(new DrawerListener() {
            @Override
            public void onDrawerSlide(View view, float v) {

            }

            @Override
            public void onDrawerOpened(View view) {

            }

            @Override
            public void onDrawerClosed(View view) {
                // your refresh code can be called from here
            }

            @Override
            public void onDrawerStateChanged(int i) {

            }
        });
}

As per kit's comment, addDrawerListener() should be used now that setDrawerListener() has been deprecated.

Community
  • 1
  • 1
  • 10
    If anyone sees this, `setDrawerListener` is deprecated. `addDrawerListener` should be used now – kit May 08 '16 at 19:41
  • I like this better than `ActionBarDrawerToggle` because it requires no parameters for the constructor – lasec0203 Apr 28 '21 at 04:11
5

setDrawerListener is deprecated use addDrawerListener instead.

drawerLayout.addDrawerListener(new DrawerListener() {
                @Override
                public void onDrawerSlide(View view, float v) {

                }

                @Override
                public void onDrawerOpened(View view) {

                }

                @Override
                public void onDrawerClosed(View view) {

                }

                @Override
                public void onDrawerStateChanged(int i) {

                }
            });
Suraj Vaishnav
  • 7,777
  • 4
  • 43
  • 46
0

Kotlin:

drawer.addDrawerListener(object : DrawerListener{
            override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
            override fun onDrawerOpened(drawerView: View) {}
            override fun onDrawerClosed(drawerView: View) {
                //todo some
            }
            override fun onDrawerStateChanged(newState: Int) {}
        }
Konstantin Konopko
  • 5,229
  • 4
  • 36
  • 62