抽屉式导航栏列表视图位置不刷新 [英] Navigation drawer listview position not refreshing

查看:203
本文介绍了抽屉式导航栏列表视图位置不刷新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 NavigationDrawer 在我的申请,我有五个项目在我的抽屉里:

  • 首页
  • 帐户
  • 股票
  • 帮助
  • 注销

现在,如果用户点击注销它会显示两个项目:

  • 首页
  • 登录

现在的问题是,当用户点击登录,它总是让查看帐户

 公共类MainActivity扩展FragmentActivity {
    私人DrawerLayout mDrawerLayout;
    私人的ListView mDrawerList;
    私人ActionBarDrawerToggle mDrawerToggle;
    私人字符串ABC;

    私人意图二;
    //导航抽屉称号
    私人的CharSequence mDrawerTitle;

    //用于存储应用程序标题
    私人的CharSequence mTitle;

    //滑动菜单项
    私有String [] navMenuTitles;
    私人TypedArray navMenuIcons;

    私人的ArrayList< NavDrawerItem> navDrawerItems;
    私人NavDrawerListAdapter适配器;

    共享preferences preFS;

    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        preFS = preferenceManager.getDefaultShared preferences(getApplicationContext());
        prefs.edit()putBoolean(锁定,真).commit()。


        二= getIntent();


        mTitle = mDrawerTitle =的getTitle();

        //负荷滑动菜单项
        navMenuTitles = getResources()getStringArray(R.array.nav_drawer_items)。

        //导航抽屉,从资源的图标
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

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



        navDrawerItems =新的ArrayList< NavDrawerItem>();



        //清空适配器阵列


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


        /*navDrawerItems.add(new NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1)));
        //查找人​​员
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1)));
        //照片
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1)));
        //社区,这里将添加计数器
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1)));
        //网页
        navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1))); * /

        // navDrawerItems.remove(新NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1)));
        //热点,我们将在这里添加计数器
        //navDrawerItems.add(new NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1)));

        //回收类型数组
        //navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(新SlideMenuClickListener());

        //设置导航抽屉名单适配器



        适配器=新NavDrawerListAdapter(getApplicationContext()
                navDrawerItems);
        mDrawerList.setAdapter(适配器);


        //使操作栏中的应用程序图标,它表现为切换按钮
        getActionBar()setDisplayHomeAsUpEnabled(真)。
        getActionBar()setHomeButtonEnabled(真)。

        mDrawerToggle =新ActionBarDrawerToggle(这一点,mDrawerLayout,
                R.drawable.ic_drawer,//导航菜单切换图标
                R.string.app_name,//导航抽屉打开 - 说明访问
                R.string.app_name //导航抽屉关闭 - 说明访问
        ){
            公共无效onDrawerClosed(查看视图){
                。getActionBar()的setTitle(mTitle);
                //调用prepareOptionsMenu()来显示操作栏图标
                invalidateOptionsMenu();
            }

            公共无效onDrawerOpened(查看drawerView){
                。getActionBar()的setTitle(mDrawerTitle);


                //布尔isUserLoggedOut = GET prefBoolean(pref_is_user_logged_out,假);

                //布尔isUserLoggedOut = prefs.getBoolean(锁定,假);


/ *
                布尔锁定= TRUE;
                共享preferences preFS = preferenceManager.getDefaultShared preferences(); * /

                //检查条件和更新列表的要求
                / *如果(isUserLoggedOut){
                    navDrawerItems.clear();

                    // 家
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1),0)); // 登录
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [5],navMenuIcons.getResourceId(5,-1),5));
                }其他{
                    navDrawerItems.clear();

                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1),0));
                    //查找人​​员
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1),1));
                    //照片
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1),2));
                    //社区,这里将添加计数器
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1),3));
                    //网页
                    navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1),4));

                }

                adapter.notifyDataSetChanged();
* /
                //调用prepareOptionsMenu()隐藏操作栏图标
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        如果(savedInstanceState == NULL){
            //关于第一导航项目首次显示视图
            displayView(0);
        }
    }

    / **
     *滑动菜单项,点击监听器
     * * /
    私有类SlideMenuClickListener工具
            ListView.OnItemClickListener {
        @覆盖
        公共无效onItemClick(适配器视图<>母公司视图中查看,INT位置,
                                长ID){
            对选定的导航抽屉的项目//显示视图

            //获取所选择的项目
            NavDrawerItem项目= navDrawerItems.get(位置);
            对选定的导航抽屉的项目//显示视图
            displayView(item.thingToDo);



            如果(位置== 4){//的退出按钮位置

                navDrawerItems.clear(); //清空适配器阵列

                navMenuIcons.recycle();

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

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


                adapter.notifyDataSetChanged();


            }
            其他 {
                如果(ii.hasExtra(登录)){
                    ABC = ii.getStringExtra(登录);

                    如果(ABC == ii.getStringExtra(登录)){
                        navDrawerItems.clear();

                        navMenuIcons.recycle();

                        navDrawerItems.add(新NavDrawerItem(navMenuTitles [0],navMenuIcons.getResourceId(0,-1),0));
                        //查找人​​员
                        navDrawerItems.add(新NavDrawerItem(navMenuTitles [1],navMenuIcons.getResourceId(1,-1),1));
                        //照片
                        navDrawerItems.add(新NavDrawerItem(navMenuTitles [2],navMenuIcons.getResourceId(2,-1),2));
                        //社区,这里将添加计数器
                        navDrawerItems.add(新NavDrawerItem(navMenuTitles [3],navMenuIcons.getResourceId(3,-1),3));
                        //网页
                        navDrawerItems.add(新NavDrawerItem(navMenuTitles [4],navMenuIcons.getResourceId(4,-1),4));

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

                        adapter.notifyDataSetChanged();
                        Toast.makeText(MainActivity.this,成功+ ABC,Toast.LENGTH_LONG).show();
                    } 其他 {
                        Toast.makeText(MainActivity.this,不成功+ ABC,Toast.LENGTH_LONG).show();
                    }
                }


            }






        }
    }

    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        //切换导航抽屉选择操作栏中的应用程序图标/标题
        如果(mDrawerToggle.onOptionsItemSelected(项目)){
            返回true;
        }
        //手柄操作栏操作点击
        开关(item.getItemId()){
            案例R.id.action_settings:
                返回true;
            默认:
                返回super.onOptionsItemSelected(项目);
        }
    }

    / * *
     *当调用invalidateOptionsMenu()被触发
     * /
    @覆盖
    公共布尔prepareOptionsMenu(功能菜单)在{
        //如果导航抽屉被打开,隐藏行动项目
        布尔drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(drawerOpen!);
        返回super.on prepareOptionsMenu(菜单);
    }

    / **
     * Diplaying片段视图选择导航抽屉列表项
     * * /
    私人无效displayView(INT位置){
        //更新替换片段的主要内容
        片段片段= NULL;
        开关(位置){
            情况下0:
                片段=新HomeFragment();
                打破;


            情况1:
            片段=新FindPeopleFragment();
                打破;
            案例2:
                片段=新PhotosFragment();
                打破;
            案例3:
                片段=新CommunityFragment();
                打破;
            壳体4:
                片段=新LoginActivity();
                打破;
            壳体5:
                片段=新LoginActivity();
                打破;
            默认:
                打破;
        }


        如果(片段!= NULL){
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container,片段).commit();

            //更新所选项目和标题,然后关上抽屉
            mDrawerList.setItemChecked(位置,真正的);
            mDrawerList.setSelection(位置);
            的setTitle(navMenuTitles [位置]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } 其他 {
            //创建片段错误
            Log.e(MainActivity,创建片段错误);
        }
    }

    @覆盖
    公共无效的setTitle(CharSequence的标题){
        mTitle =称号;
        。getActionBar()的setTitle(mTitle);
    }



    @覆盖
    保护无效onPostCreate(包savedInstanceState){
        super.onPostCreate(savedInstanceState);
        //同步发生onRestoreInstanceState后切换状态。
        mDrawerToggle.syncState();
    }

    @覆盖
    公共无效onConfigurationChanged(配置NEWCONFIG){
        super.onConfigurationChanged(NEWCONFIG);
        //传递任何配置更改抽屉toggls
        mDrawerToggle.onConfigurationChanged(NEWCONFIG);
    }

}
 

适配器

 公共类NavDrawerListAdapter扩展了BaseAdapter {

    私人上下文的背景下;
    私人的ArrayList< NavDrawerItem> navDrawerItems;

    公共NavDrawerListAdapter(上下文的背景下,ArrayList的< NavDrawerItem> navDrawerItems){
        this.context =背景;
        this.navDrawerItems = navDrawerItems;
    }

    @覆盖
    公众诠释getCount将(){
        返回navDrawerItems.size();
    }

    @覆盖
    公共对象的getItem(INT位置){
        返回navDrawerItems.get(位置);
    }

    @覆盖
    众长getItemId(INT位置){
        返回的位置;
    }

    @覆盖
    公共查看getView(INT位置,查看convertView,ViewGroup中父){
        如果(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(位置).getIcon());
        txtTitle.setText(navDrawerItems.get(位置).getTitle());

        //显示计数
        //检查是否设置可见或不可见
        如果(navDrawerItems.get(位置).getCounterVisibility()){
            txtCount.setText(navDrawerItems.get(位置).getCount());
        }其他{
            //隐藏计数器视图
            txtCount.setVisibility(View.GONE);
        }

        返回convertView;
    }

}
 

Login_Activity

 公共类LoginActivity扩展片段{

    公共LoginActivity(){}

    私人按钮alreadymember;
    私人按钮结账;
    私人按钮forgotpass;

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){
        最后查看rootView = inflater.inflate(R.layout.login_activity,集装箱,假);

        alreadymember =(按钮)rootView.findViewById(R.id.btn_login_alredymember);
        forgotpass =(按钮)rootView.findViewById(R.id.login_forgot_pwd);
        结帐=(按钮)rootView.findViewById(R.id.checkout_login);

        alreadymember.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图查看){

               意向意图=新的意图(getActivity(),MainActivity.class);
                intent.putExtra(登录,密码);
                startActivity(意向);
               / * HomeFragment TF =新HomeFragment();
                android.support.v4.app.FragmentManager FM = getFragmentManager();
                android.support.v4.app.FragmentTransaction英尺= fm.beginTransaction();
                束束=新包();
                bundle.putString(登录,密码);
                tf.setArguments(包);
                ft.replace(R.id.frame_container,TF);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(空);
                ft.commit(); * /
            }
        });

        forgotpass.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图查看){
                Forgot_Password TF =新Forgot_Password();
                android.support.v4.app.FragmentManager FM = getFragmentManager();
                android.support.v4.app.FragmentTransaction英尺= fm.beginTransaction();
                ft.replace(R.id.frame_container,TF);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(空);
                ft.commit();
            }
        });


        checkout.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图查看){
                CheckoutBeforeLogin TF =新CheckoutBeforeLogin();
                android.support.v4.app.FragmentManager FM = getFragmentManager();
                android.support.v4.app.FragmentTransaction英尺= fm.beginTransaction();
                ft.replace(R.id.frame_container,TF);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.addToBackStack(空);
                ft.commit();
            }
        });
        返回rootView;
    }
}
 

解决方案

您一直在呼吁 displayView()在列表中选择索引位置 NavDrawerItems 。在用户注销的情况下,只有2列表中的项目。当用户选择登录,该指数的位置是1,而不是5。

您可能想多一个变量添加到 NavDrawerItem 从而重新presents其中片段时显示用户选择该项目。你可以使用任何的 INT 值,然后被传递到 displayView(),或者您可以使用的类名在片段显示。

编辑:添加例如code

NavDrawerItem ,你应该是这样的:

 字符串称号;
图标图标;
 

添加以下内容:

  INT thingToDo;
 

然后,在 NavDrawerItem 的构造函数, INT 参数添加到构造函数初始化该领域,如这样的:

 公共NavDrawerItem(字符串名称,图标图标,诠释thingToDo){
    this.title =称号;
    this.icon =图标;
    this.thingToDo = thingToDo;
}
 

更改所有来电,创造新的 NavDrawerItem 实例包括事情,是这样的:

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

然后,在 SlideMenuClickListener.onItemClick()方法,做到这一点:

 公共无效onItemClick(适配器视图<>母公司视图中查看,INT位置,
                        长ID){
    //获取所选择的项目
    NavDrawerItem项目= navDrawerItems.get(位置);
    对选定的导航抽屉的项目//显示视图
    displayView(item.thingToDo);
}
 

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;
    }
}

解决方案

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);
}

这篇关于抽屉式导航栏列表视图位置不刷新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆