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

时间:2014-04-27 17:33:16

标签: android navigation-drawer

首先,大多数代码来自here

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

现在,我试图理解的是如何根据数据库中的数据更改数字计数器。

所以这里是代码 -

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

现在,我如何再次为adapter设置mDrawerList

我知道onDrawerOpened可以成为一个好地方。

为了达到这个目的,我需要使用哪种代码?

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

Now how can i set again the adapter for the mDrawerList.

你不应该。相反,如果适配器的数据已更改,您可以简单地调用Adapter:notifyDatasetChanged()

I understand that onDrawerOpened can be a good place to do it.

不确定,因为它代表处于稳定状态的抽屉,即 - 用户可见。从这一刻起发生的任何变化都会显得奇怪或可能会降低用户体验,或两者兼而有之。不过,我想,为了简单起见,你可以试试

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

What kind of code am I need to use in order to that?

如果您打算使用数据库中的信息更新您的navdrawer,那么如果您的 NavDrawerListAdapter 将继承 CursorAdapter,那将会很不错。

如果您设法成功更改适配器代码以使用Cursor代替/而不是硬编码元素,则其余任务就像:

  1. 查询数据库以获取信息。结果将是Cursor指向您的数据

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

  3. 同样,如果“loading”部分异步发生,例如在AsyncTaskLoader中,或者在AsyncTask中发生(如果没有正确处理配置更改则不太可取),这样会更好。 / p>