Android-如何刷新导航抽屉的菜单项

Android-如何刷新导航抽屉的菜单项,android,navigation-drawer,Android,Navigation Drawer,首先,大部分代码都来自 好的,这里有一个创建导航抽屉的活动代码, 导航抽屉菜单项包括图像视图、文本和数字计数器 现在我想了解的是如何根据数据库中的数据更改数字计数器 这是代码- @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nav_activity_main); mTitl

首先,大部分代码都来自

好的,这里有一个创建导航抽屉的活动代码, 导航抽屉菜单项包括图像视图、文本和数字计数器

现在我想了解的是如何根据数据库中的数据更改数字计数器

这是代码-

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

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

    dbHand = new DbHandler(this);
    int numOfBotn = dbHand.queryAllBotnstonum();
    String numBotn = String.valueOf(numOfBotn);

    int numOfgROUPmSG = dbHand.newAllNewGroupMessages();
    String numNewgRmsg = String.valueOf(numOfgROUPmSG);

    lhand = new LocalStorageHandler(this);
    int newprasoMsg = lhand.gotAllNewMsg();
    String numNewPersonalMsg = String.valueOf(newprasoMsg);
    // adding nav drawer items to array
    // Home
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1), true, numNewPersonalMsg));
    // Find People
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1), true , numNewgRmsg));
    // Photos
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1), true, numBotn));
    // 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)));
    // What's hot, We  will add a counter here
    //navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));


    // 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().setBackgroundDrawable(getResources().getDrawable(R.color.button_positive_off));

    //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) {
            Log.d("OUT", "CLOSED");
            getActionBar().setTitle(mTitle);
            // calling onPrepareOptionsMenu() to show action bar icons
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {

            getActionBar().setTitle(mDrawerTitle);
            // 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);
    }
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.nav_活动主视图);
mTitle=mDrawerTitle=getTitle();
//加载幻灯片菜单项
navMenuTitles=getResources().getStringArray(R.array.nav\u抽屉\u项目);
//参考资料中的导航抽屉图标
navMenuIcons=getResources()
.obtainTypedArray(R.array.nav_drawer_图标);
mDrawerLayout=(抽屉布局)findViewById(R.id.抽屉布局);
mDrawerList=(ListView)findViewById(R.id.list\u slidermenu);
navDrawerItems=新的ArrayList();
dbHand=newdbhandler(this);
int numobotn=dbHand.queryalbotnstonum();
String numBotn=String.valueOf(numofotn);
int numOfgROUPmSG=dbHand.newAllNewGroupMessages();
字符串numNewgRmsg=String.valueOf(numOfgROUPmSG);
lhand=新的LocalStorageHandler(此);
int newprasoMsg=lhand.gotAllNewMsg();
String numNewPersonalMsg=String.valueOf(newprasoMsg);
//将导航抽屉项添加到阵列
//家
add(新的NavDrawerItem(navMenuTitles[0],navMenuIcons.getResourceId(0,-1),true,numNewPersonalMsg));
//找人
添加(新的NavDrawerItem(navMenuTitles[1],navMenuIcons.getResourceId(1,-1),true,numNewgRmsg));
//照片
add(新的NavDrawerItem(navMenuTitles[2],navMenuIcons.getResourceId(2,-1),true,numBotn));
//社区,将在此处添加一个计数器
add(新的NavDrawerItem(navMenuTitles[3],navMenuIcons.getResourceId(3,-1));
//页数
add(新的NavDrawerItem(navMenuTitles[4],navMenuIcons.getResourceId(4,-1));
//什么是热的,我们将在这里加一个计数器
//add(新的NavDrawerItem(navMenuTitles[5],navMenuIcons.getResourceId(5,-1),true,“50+”));
//回收类型化数组
navMenuIcons.recycle();
setOnItemClickListener(新的SlideMenuClickListener());
//设置导航抽屉列表适配器
适配器=新的NavDroperListAdapter(getApplicationContext(),
纳维特姆斯);
mDrawerList.setAdapter(适配器);
//启用操作栏应用程序图标并将其作为切换按钮
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setBackgroundDrawable(getResources().getDrawable(R.color.button_positive_off));
//getActionBar().setHomeButtonEnabled(true);
mDrawerToggle=新操作BarDrawerToggle(此,mDrawerLayout,
R.drawable.ic_抽屉,//导航菜单切换图标
R.string.app_name,//导航抽屉打开-可访问性说明
R.string.app_name//nav抽屉关闭-可访问性说明
) {
公共无效onDrawerClosed(视图){
日志d(“退出”、“关闭”);
getActionBar().setTitle(mTitle);
//调用onPrepareOptions菜单()以显示操作栏图标
无效操作菜单();
}
打开图纸上的公共空白(视图抽屉视图){
getActionBar().setTitle(mDrawerTitle);
//调用onPrepareOptions菜单()隐藏操作栏图标
无效操作菜单();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
如果(savedInstanceState==null){
//第一个导航项目的首次显示视图
显示视图(0);
}
现在,我如何为
mDrawerList
再次设置
适配器

我知道,
onDrawerOpened
是一个很好的地方

我需要使用什么样的代码才能做到这一点


谢谢您的帮助。

现在我如何再次设置mDrawerList的适配器。

您不应该这样做。相反,如果适配器的数据已更改,您只需调用
适配器:notifyDatasetChanged()

我知道onDrawerOpened是一个很好的地方。

不确定,因为它代表一个处于固定状态的抽屉,这对用户来说是可见的。从这一刻起发生的任何变化似乎都很奇怪,或者可能会降低用户体验,或者两者兼而有之。不过,我想,为了简单起见,您可以尝试一下

更好的解决方案需要您实现自己的和一个内容观察者,该内容观察者将根据对底层数据源所做的更改触发事件。如果您还不熟悉这些结构,这将是一个挑战

我需要使用什么样的代码才能做到这一点?

如果您打算用数据库中的信息更新您的navdrawer,那么如果您的NavDrawerListAdapter将子类化将非常好

如果您成功地将适配器代码更改为使用
光标
,而不是硬编码元素/除了硬编码元素之外,其余任务就简单得多:

  • 查询数据库中的信息。结果将指向您的数据

  • 将新光标设置为NavDrawerListAdapter,并在此适配器上调用
    notifyDatasetChanged()

  • 同样,如果这个“加载”部分以异步方式发生,例如在AsyncTaskLoader中,或者在AsyncTask中(如果您没有正确处理配置更改,则不太可取),则效果会更好