Navigation drawer listview position not refreshing
Asked Answered
T

4

1

I have one NavigationDrawer in my Application and I have five items in my drawer:

  • Home
  • Accounts
  • stock
  • help
  • logout

Now if user click on logout it is displaying two items:

  • Home
  • Login

Now the issue is when user click on login it always getting view of Accounts

 public class MainActivity extends FragmentActivity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private String abc;

    private Intent ii;
    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

    SharedPreferences prefs;

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

        prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        prefs.edit().putBoolean("locked", true).commit();


        ii=getIntent();


        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);



        navDrawerItems = new ArrayList<NavDrawerItem>();



        // empty the adapter array


        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1), 0));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), 5));


        /*navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));*/

        //  navDrawerItems.remove(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));
        // What's hot, We  will add a counter here
        //navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));

        // Recycle the typed array
        //navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter



        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);


        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);


                //boolean isUserLoggedOut = getPrefBoolean("pref_is_user_logged_out",false);

                //Boolean isUserLoggedOut = prefs.getBoolean("locked", false);


/*
                boolean locked = true;
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences();*/

                // Check Condition and Update list as required
                /*if(isUserLoggedOut){
                    navDrawerItems.clear();

                    // Home
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1),0));                   // Login
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1),5));
                }else{
                    navDrawerItems.clear();

                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1),0));
                    // Find People
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1),1));
                    // Photos
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1),2));
                    // Communities, Will add a counter here
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1),3));
                    // Pages
                    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1),4));

                }

                adapter.notifyDataSetChanged();
*/
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
            // display view for selected nav drawer item

            // Get the item that was selected
            NavDrawerItem item = navDrawerItems.get(position);
            // display view for selected nav drawer item
            displayView(item.thingToDo);



            if(position == 4) { // position of Sign out button

                navDrawerItems.clear(); // empty the adapter array

                navMenuIcons.recycle();

                navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1),0));
                navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1),5));

                //navDrawerItems.remove(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));


                adapter.notifyDataSetChanged();


            }
            else {
                if (ii.hasExtra("login")) {
                    abc = ii.getStringExtra("login");

                    if (abc == ii.getStringExtra("login")) {
                        navDrawerItems.clear();

                        navMenuIcons.recycle();

                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1),0));
                        // Find People
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1),1));
                        // Photos
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1),2));
                        // Communities, Will add a counter here
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1),3));
                        // Pages
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1),4));

                    //  navDrawerItems.remove(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));

                        adapter.notifyDataSetChanged();
                        Toast.makeText(MainActivity.this, "success" + abc, Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(MainActivity.this, "unsuccess" + abc, Toast.LENGTH_LONG).show();
                    }
                }


            }






        }
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    /* *
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new HomeFragment();
                break;


            case 1:
            fragment = new FindPeopleFragment();
                break;
            case 2:
                fragment = new PhotosFragment();
                break;
            case 3:
                fragment = new CommunityFragment();
                break;
            case 4:
                fragment = new LoginActivity();
                break;
            case 5:
                fragment = new LoginActivity();
                break;
            default:
                break;
        }


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

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }



    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

}

Adapter

public class NavDrawerListAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<NavDrawerItem> navDrawerItems;

    public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){
        this.context = context;
        this.navDrawerItems = navDrawerItems;
    }

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

    @Override
    public Object getItem(int position) {       
        return navDrawerItems.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.drawer_list_item, null);
        }

        ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
        TextView txtTitle = (TextView) convertView.findViewById(R.id.title);
        TextView txtCount = (TextView) convertView.findViewById(R.id.counter);

        imgIcon.setImageResource(navDrawerItems.get(position).getIcon());        
        txtTitle.setText(navDrawerItems.get(position).getTitle());

        // displaying count
        // check whether it set visible or not
        if(navDrawerItems.get(position).getCounterVisibility()){
            txtCount.setText(navDrawerItems.get(position).getCount());
        }else{
            // hide the counter view
            txtCount.setVisibility(View.GONE);
        }

        return convertView;
    }

}

Login_Activity

public class LoginActivity extends Fragment{

    public LoginActivity(){}

    private Button alreadymember;
    private Button checkout;
    private Button forgotpass;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.login_activity, container, false);

        alreadymember=(Button)rootView.findViewById(R.id.btn_login_alredymember);
        forgotpass=(Button)rootView.findViewById(R.id.login_forgot_pwd);
        checkout=(Button)rootView.findViewById(R.id.checkout_login);

        alreadymember.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

               Intent intent=new Intent(getActivity(),MainActivity.class);
                intent.putExtra("login","login");
                startActivity(intent);
               /* HomeFragment tf = new HomeFragment();
                android.support.v4.app.FragmentManager fm = getFragmentManager();
                android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
                Bundle bundle = new Bundle();
                bundle.putString("login", "login");
                tf.setArguments(bundle);
                ft.replace(R.id.frame_container, tf);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(null);
                ft.commit();*/
            }
        });

        forgotpass.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Forgot_Password tf = new Forgot_Password();
                android.support.v4.app.FragmentManager fm = getFragmentManager();
                android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.frame_container, tf);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(null);
                ft.commit();
            }
        });


        checkout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CheckoutBeforeLogin tf = new CheckoutBeforeLogin();
                android.support.v4.app.FragmentManager fm = getFragmentManager();
                android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.frame_container, tf);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(null);
                ft.commit();
            }
        });
        return rootView;
    }
}
Turman answered 6/6, 2015 at 13:6 Comment(3)
not getting What you exactly want.Nutt
Post your implementation of` NavDrawerListAdapter` or provide a link to a library you are using.Granese
sir i edited my question with adapter..Turman
G
1

You are always calling displayView() with the selected index position in the list of NavDrawerItems. In the case where the user is logged out, there are only 2 items in the list. When the user chooses "login", the index position is 1, not 5.

You probably want to add one more variable to NavDrawerItem which represents which Fragment to show when the user selects that item. You could use either an int value which is then passed to displayView(), or your could use the class name of the Fragment to show.

EDIT: Add example code

In NavDrawerItem, you should have something like:

String title;
Icon icon;

add the following:

int thingToDo;

Then, in the constructor of NavDrawerItem, add an int parameter to the constructor to initialize the field, like this:

public NavDrawerItem(String title, Icon icon, int thingToDo) {
    this.title = title;
    this.icon = icon;
    this.thingToDo = thingToDo;
}

change all your calls that create new NavDrawerItem instances to include the "thing to do", like this:

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1), 0));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), 5));

Then, in SlideMenuClickListener.onItemClick() method, do this:

public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
    // Get the item that was selected
    NavDrawerItem item = navDrawerItems.get(position);
    // display view for selected nav drawer item
    displayView(item.thingToDo);
}
Granese answered 11/6, 2015 at 10:44 Comment(6)
Yes, looks right. You've commented out the code that changes the set of nav drawer items though. You'll want to reenable that code so that the user gets the correct list of items in the nav drawer when he is logged in/Granese
sir i change my mainactivity,can you tell is it right?cuz it works bit different..Turman
Sorry, I do not understand your application architecture and at this point I don't understand what your problem is. I provided you with a solution to the first problem that you mentioned. At this point, your code doesn't resemble the original code and it looks like your having a different problem as well. If you keep changing the code and then ask for help it makes it impossible to follow. What exactly is your problem now?Granese
Sir right now issue is whenever user click on alreadymember button of login activity,user should login and other options like Home,MyAcccount, etc should be appear..but its not appear..Turman
Looking at the code you have now posted, when user clicks "alreadymember" in LoginActivity, this starts MainActivity. However, in MainActivity you never add the other options to the navigation drawer, you only add items numbered 0 and 5. This is why only these 2 items show up. You need to check in onCreate() of MainActivity if the user is logged in or not and then set the navigation drawer items appropriately.Granese
#32136274Turman
A
1

You can do it in onDrawerOpened method like this.

  mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
    R.drawable.ic_drawer, //nav menu toggle icon
    R.string.app_name, // nav drawer open - description for accessibility
    R.string.app_name // nav drawer close - description for accessibility
    ) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);

            // get value from preference, whether user is logged in or not
            boolean isUserLoggedOut = getPrefBoolean("pref_is_user_logged_out",false);

            // Check Condition and Update list as required
            if(isUserLoggedOut){
                  navDrawerItems.clear();

                  // Home
                  navDrawerItems.add(new NavDrawerItem("Home", navMenuIcons.getResourceId(HOME_ICON_ID, -1)));
                 // Login
                 navDrawerItems.add(new NavDrawerItem("Login", navMenuIcons.getResourceId(LOGIN_ICON_ID, -1)));
            }else{
                  navDrawerItems.clear();

                  navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
                  // Find People
                  navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
                  // Photos
                  navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
                  // Communities, Will add a counter here
                  navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
                  // Pages
                  navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));

            }

            adapter.notifyDataSetChanged();

            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
Anthe answered 6/6, 2015 at 13:55 Comment(2)
isUserLoggedOut is the boolean value you will get from PrefAnthe
i am just using staitic login page..i am not workijg with prefTurman
G
1

You are always calling displayView() with the selected index position in the list of NavDrawerItems. In the case where the user is logged out, there are only 2 items in the list. When the user chooses "login", the index position is 1, not 5.

You probably want to add one more variable to NavDrawerItem which represents which Fragment to show when the user selects that item. You could use either an int value which is then passed to displayView(), or your could use the class name of the Fragment to show.

EDIT: Add example code

In NavDrawerItem, you should have something like:

String title;
Icon icon;

add the following:

int thingToDo;

Then, in the constructor of NavDrawerItem, add an int parameter to the constructor to initialize the field, like this:

public NavDrawerItem(String title, Icon icon, int thingToDo) {
    this.title = title;
    this.icon = icon;
    this.thingToDo = thingToDo;
}

change all your calls that create new NavDrawerItem instances to include the "thing to do", like this:

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1), 0));
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), 5));

Then, in SlideMenuClickListener.onItemClick() method, do this:

public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
    // Get the item that was selected
    NavDrawerItem item = navDrawerItems.get(position);
    // display view for selected nav drawer item
    displayView(item.thingToDo);
}
Granese answered 11/6, 2015 at 10:44 Comment(6)
Yes, looks right. You've commented out the code that changes the set of nav drawer items though. You'll want to reenable that code so that the user gets the correct list of items in the nav drawer when he is logged in/Granese
sir i change my mainactivity,can you tell is it right?cuz it works bit different..Turman
Sorry, I do not understand your application architecture and at this point I don't understand what your problem is. I provided you with a solution to the first problem that you mentioned. At this point, your code doesn't resemble the original code and it looks like your having a different problem as well. If you keep changing the code and then ask for help it makes it impossible to follow. What exactly is your problem now?Granese
Sir right now issue is whenever user click on alreadymember button of login activity,user should login and other options like Home,MyAcccount, etc should be appear..but its not appear..Turman
Looking at the code you have now posted, when user clicks "alreadymember" in LoginActivity, this starts MainActivity. However, in MainActivity you never add the other options to the navigation drawer, you only add items numbered 0 and 5. This is why only these 2 items show up. You need to check in onCreate() of MainActivity if the user is logged in or not and then set the navigation drawer items appropriately.Granese
#32136274Turman
C
1

The code is very confusing to follow. So I'll submit suggested sample code and at best it will be a workaround.

In method displayView(), it displays the Fragment based on position, obviously. When the app is in Login state, you only have 2 positions, Home and Login, as you stated. But displayView() will show the FindPeopleFragment when user selects Login, which is position = 1. Understand? This part of the code design is confusing, the code changes the positions dynamically on run-time while displayView() is static when checking for the position. Now, there are many solutions to this, I would suggest a minor code redesign such that the app checks for item strings instead of position.

However since that would be more involved, I can give you simple workaround fix. Code fix:

// Get the item that was selected
NavDrawerItem item = navDrawerItems.get(position);

if(position == 4) { // position of Sign out button
   displayView( 4 );   // show the Login fragment
   ...
}
else {
   displayView(item.thingToDo);
   ...
}

Note:

  1. I added the workaround fix of displayView( 4 );
  2. David Wasser put a good posted answer for you to understand. His post is useful and compliments my post well. I don't want to repeat his texts.

I need to move on with other questions. Good luck in your project...

Crossindex answered 11/6, 2015 at 19:45 Comment(1)
i mentioned issue,can you help me with this sirTurman
F
0

If you detect login situation, you can set adapter of drawer If you are login change the navDrawerItems and set adapter.

adapter = new NavDrawerListAdapter(getApplicationContext(),
            navDrawerItems);

    mDrawerList.setAdapter(adapter);
Flicker answered 8/6, 2015 at 7:1 Comment(3)
Yes, if yo detect the log in, call the a method which set adapter of NavDraweAdapterPika
where i can i set adapter..in which methodTurman
no its not working..for 2 second it shows home and login option..but then again five option displayingTurman

© 2022 - 2024 — McMap. All rights reserved.