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中(如果您没有正确处理配置更改,则不太可取),则效果会更好