
我正在尝试实现两级DrawerLayout.作为基线,我正在使用http://developer.android.com/training/implementing-navigation/nav-drawer.html的Google行星示例.所以我想扩展这个例子,这样从行星列表中选择一个行星,用行星上的城市列表替换行星列表(除了地球以外大多空白 – 我仍在充实我的数据: – )).
我想我可以采取三种方法: –
>替换ListVIEw
>保留ListVIEw,但替换其ArrayAdapter
>保留ListVIEw和ArrayAdapter,但替换适配器的数据
所以尝试选项3(这是最好的方法吗?),在我的DrawerItemClickListener中,我执行以下 *** 作…
arrayAdapter.clear(); arrayAdapter.addAll(arraylistofCitIEs);arrayAdapter.notifyDataSetChanged(); mDrawerList.invalIDateVIEws();mDrawerList.forceLayout();mDrawerList.refreshDrawableState();但它似乎没有用,即行星列表不会被城市列表所取代.
我的方法是否正确?如果是,我如何让列表刷新?
解决方法:
Replace the ListVIEw
真的没有必要.
Keep the ListVIEw, but replace its ArrayAdapter
这将是最容易实现的.首先,将以下字符串数组(城市名称)添加到res / values / strings.xml:
<string-array name="mercury_array"> <item>Undiscovered City 1 (Mercury)</item> <item>Undiscovered City 2 (Mercury)</item> <item>Undiscovered City 3 (Mercury)</item> <item>Undiscovered City 4 (Mercury)</item></string-array><string-array name="venus_array"> <item>Undiscovered City 1 (Venus)</item> <item>Undiscovered City 2 (Venus)</item> <item>Undiscovered City 3 (Venus)</item> <item>Undiscovered City 4 (Venus)</item></string-array><string-array name="earth_array"> <item>New York</item> <item>Hong Kong</item> <item>New Delhi</item> <item>London</item></string-array><string-array name="mars_array"> <item>Undiscovered City 1 (Mars)</item> <item>Undiscovered City 2 (Mars)</item> <item>Undiscovered City 3 (Mars)</item> <item>Undiscovered City 4 (Mars)</item></string-array><string-array name="jupiter_array"> <item>Undiscovered City 1 (Jupiter)</item> <item>Undiscovered City 2 (Jupiter)</item> <item>Undiscovered City 3 (Jupiter)</item> <item>Undiscovered City 4 (Jupiter)</item></string-array><string-array name="saturn_array"> <item>Undiscovered City 1 (Saturn)</item> <item>Undiscovered City 2 (Saturn)</item> <item>Undiscovered City 3 (Saturn)</item> <item>Undiscovered City 4 (Saturn)</item></string-array><string-array name="uranus_array"> <item>Undiscovered City 1 (Uranus)</item> <item>Undiscovered City 2 (Uranus)</item> <item>Undiscovered City 3 (Uranus)</item> <item>Undiscovered City 4 (Uranus)</item></string-array><string-array name="neptune_array"> <item>Undiscovered City 1 (Neptune)</item> <item>Undiscovered City 2 (Neptune)</item> <item>Undiscovered City 3 (Neptune)</item> <item>Undiscovered City 4 (Neptune)</item></string-array>在MainActivity中创建方法loadContentList(int).这是在主菜单点击项目时调用的方法:
private voID loadContentList(int position) { setTitle(mPlanetTitles[position]); String[] content; switch(position) { case 0: content = getResources().getStringArray(R.array.mercury_array); break; case 1: content = getResources().getStringArray(R.array.venus_array); break; case 2: content = getResources().getStringArray(R.array.earth_array); break; case 3: content = getResources().getStringArray(R.array.mars_array); break; case 4: content = getResources().getStringArray(R.array.jupiter_array); break; case 5: content = getResources().getStringArray(R.array.saturn_array); break; case 6: content = getResources().getStringArray(R.array.uranus_array); break; case 7: content = getResources().getStringArray(R.array.neptune_array); break; default: content = getResources().getStringArray(R.array.neptune_array); } // Change ListVIEw's adapter mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_List_item, content)); // Change OnItemClickListener // CityItemClickListener is defined below mDrawerList.setonItemClickListener(new CityItemClickListener());}由于我们想要在点击行星项目时更新ListVIEw,我们将更改DrawerItemClickListener的方法体并调用新添加的loadContentList(int):
/* The click Listner for ListVIEw in the navigation drawer */private class DrawerItemClickListener implements ListVIEw.OnItemClickListener { @OverrIDe public voID onItemClick(AdapterVIEw<?> parent, VIEw vIEw, int position, long ID) { //selectItem(position); loadContentList(position); }}单击一个城市时,我们将需要另一个OnItemClickListener来更改片段. :
private class CityItemClickListener implements ListVIEw.OnItemClickListener { @OverrIDe public voID onItemClick(AdapterVIEw<?> parent, VIEw vIEw, int position, long ID) { // This is the method that was being called on planet click // in the original example. Implementation of it is up to you selectItem(position); }}Keep the ListVIEw and the ArrayAdapter, but replace the adapter’s data
定义ArrayAdapter:
private ListVIEw mDrawerList;private ActionbarDrawerToggle mDrawerToggle; ---------> private ArrayAdapter<String> mAdapter; 在MainActivity的onCreate(Bundle)中:
ArrayList<String> planetList = new ArrayList<String>();planetList.addAll(Arrays.asList(mPlanetTitles));mAdapter = new ArrayAdapter<String>(this, R.layout.drawer_List_item, planetList);// set up the drawer's List vIEw with itemsmDrawerList.setAdapter(mAdapter); 调用mAdapter.clear()时,我们必须传递一个ArrayList以避免UnsupportedOperationException.
将loadContentList(int)更改为以下内容:
private voID loadContentList2(int position) { setTitle(mPlanetTitles[position]); String[] content; switch(position) { .... .... } ArrayList<String> cityList = new ArrayList<String>(); cityList.addAll(Arrays.asList(content)); mAdapter.clear(); mAdapter.addAll(cityList); // update mAdapter.notifyDataSetChanged(); // Change on item click Listener mDrawerList.setonItemClickListener(new CityItemClickListener());}CityItemClickListener和DrawerItemClickListener将保持原样.唯一的变化是:我们没有在行星列表项目上创建新的ArrayAdapter点击.
您需要找出一种方法(可能是一个按钮),以便用户从城市视图返回到行星列表.
我还建议您查看ExpandableListVIEw.它可以更优雅地解决您的问题.
总结以上是内存溢出为你收集整理的android – 如何实现两级DrawerLayout全部内容,希望文章能够帮你解决android – 如何实现两级DrawerLayout所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)