【问题标题】:How to create expandable listview in navigation drawer using xamarin android如何使用 xamarin android 在导航抽屉中创建可扩展的列表视图
【发布时间】:2016-09-09 05:59:01
【问题描述】:

请在导航抽屉中提供可扩展列表视图的 c# 代码或示例。 我在 Xamarin Studio 中使用 Xamarin.Android。

我想像下图这样创建。

navigation drawer with expandable listview

我不熟悉 java 代码。 谢谢。

【问题讨论】:

    标签: c# listview xamarin.android


    【解决方案1】:

    我做了一个代码示例,其中标题项也有图标。

    在 MainActivity.cs 我有:

    using Android.App;
    using Android.Widget;
    using Android.OS;
    using Android.Support.V7.App;
    using Toolbar = Android.Support.V7.Widget.Toolbar;
    using Android.Support.Design.Widget;
    using System;
    using Android.Support.V4.Widget;
    using System.Collections.Generic;
    using Android.Views;
    
    namespace NavigationDrawer_ExpandableListView
    {
        [Activity(Label = "NavigationDrawer_ExpandableListView", MainLauncher = true, Icon = "@drawable/icon", Theme = "@style/MyTheme")]
        public class MainActivity : AppCompatActivity
        {
            private DrawerLayout drawerLayout;
            ExpandableListAdapter menuAdapter;
            ExpandableListView expandableList;
            List<ExpandedMenuModel> listDataHeader;
            Dictionary<ExpandedMenuModel, List<String>> listDataChild;
    
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
    
    
                SetContentView (Resource.Layout.Main);
                var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
    
                //Toolbar will now take on default actionbar characteristics
                SetSupportActionBar(toolbar);
    
                SupportActionBar.Title = "Hello from Appcompat Toolbar";
    
                ExpandableListView expandableList = FindViewById<ExpandableListView>(Resource.Id.navigationmenu);
                NavigationView navigationView = FindViewById<NavigationView>(Resource.Id.nav_view);
    
                if (navigationView != null)
                {
                    navigationView.NavigationItemSelected += OnNavigationItemSelected;
                }
    
    
                PrepareListData();
                menuAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild, expandableList);
    
                // setting list adapter
                expandableList.SetAdapter(menuAdapter);
    
            }
    
            private void PrepareListData()
            {
                listDataHeader = new List<ExpandedMenuModel>();
                listDataChild = new Dictionary<ExpandedMenuModel, List<String>>();
    
                ExpandedMenuModel item1 = new ExpandedMenuModel();
                item1.Name = "heading1";
                item1.Image = Resource.Drawable.abc_ic_menu_copy_mtrl_am_alpha;
                // Adding data header
                listDataHeader.Add(item1);
    
                ExpandedMenuModel item2 = new ExpandedMenuModel();
                item2.Name = "heading2";
                item2.Image = Resource.Drawable.abc_ic_voice_search_api_material;
                listDataHeader.Add(item2);
    
                ExpandedMenuModel item3 = new ExpandedMenuModel();
                item3.Name = "heading3";
                item3.Image = Resource.Drawable.abc_ic_menu_share_mtrl_alpha;
                listDataHeader.Add(item3);
    
                ExpandedMenuModel item4 = new ExpandedMenuModel();
                item4.Name = "heading4";
                item4.Image = Resource.Drawable.abc_ic_menu_paste_mtrl_am_alpha;
                listDataHeader.Add(item4);
    
                // Adding child data
                List<String> heading1 = new List<String>();
                heading1.Add("Submenu of item 1");
    
                List<String> heading2 = new List<String>();
                heading2.Add("Submenu of item 2");
                heading2.Add("Submenu of item 2");
                heading2.Add("Submenu of item 2");
    
                List<String> heading3 = new List<String>();
                heading3.Add("Submenu of item 3");
                heading3.Add("Submenu of item 3");
    
                List<String> heading4 = new List<String>();
                heading4.Add("Submenu of item 4");
                heading4.Add("Submenu of item 4");
    
                listDataChild.Add(listDataHeader[0], heading1);// Header, Child data
                listDataChild.Add(listDataHeader[1], heading2);
                listDataChild.Add(listDataHeader[2], heading3);
                listDataChild.Add(listDataHeader[3], heading4);
            }
    
            public override bool OnOptionsItemSelected(IMenuItem item)
            {
                switch (item.ItemId)
                {
                    case Android.Resource.Id.Home:
                        drawerLayout.OpenDrawer(Android.Support.V4.View.GravityCompat.Start);
                        return true;
                }
                return base.OnOptionsItemSelected(item);
            }
    
            private void OnNavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e)
            {
    
                var menuItem = e.MenuItem;
                menuItem.SetChecked(!menuItem.IsChecked);
                drawerLayout.CloseDrawers();
            }
    
        }
    }
    

    ExpandableListAdapter.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Android.App;
    using Android.Content;
    using Android.OS;
    using Android.Runtime;
    using Android.Views;
    using Android.Widget;
    using Java.Lang;
    
    namespace NavigationDrawer_ExpandableListView
    {
        class ExpandableListAdapter : BaseExpandableListAdapter
        {
            private Activity _context;
            private List<ExpandedMenuModel> _listDataHeader; // header titles
    
            // child data in format of header title, child title
            private Dictionary<ExpandedMenuModel, List<string>> _listDataChild;
            ExpandableListView expandList;
    
            public ExpandableListAdapter(Activity context, List<ExpandedMenuModel> listDataHeader, Dictionary<ExpandedMenuModel, List<string>> listChildData, ExpandableListView mView)
            {
                _context = context;
                _listDataHeader = listDataHeader;
                _listDataChild = listChildData;
                expandList = mView;
            }
            public override int GroupCount
            {
                get
                {
                    return _listDataHeader.Count;
                }
            }
    
            public override bool HasStableIds
            {
                get
                {
                    return false;
                }
            }
    
            public override Java.Lang.Object GetChild(int groupPosition, int childPosition)
            {
                return _listDataChild[_listDataHeader[groupPosition]][childPosition];
            }
    
            public override long GetChildId(int groupPosition, int childPosition)
            {
                return childPosition;
            }
    
            public override int GetChildrenCount(int groupPosition)
            {
                int childCount = _listDataChild[_listDataHeader[groupPosition]].Count;
                return childCount;
            }
    
            public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
            {
                string childText = (string)GetChild(groupPosition, childPosition);
                if (convertView == null)
                {
                    convertView = _context.LayoutInflater.Inflate(Resource.Layout.list_submenu, null);
                }
                TextView txtListChild = (TextView)convertView.FindViewById(Resource.Id.submenu);
                txtListChild.Text = childText;
                return convertView;
            }
    
            public override Java.Lang.Object GetGroup(int groupPosition)
            {
                return new JavaObjectWrapper<ExpandedMenuModel>() { Obj = _listDataHeader[groupPosition] };
            }
    
            public override long GetGroupId(int groupPosition)
            {
                return groupPosition;
            }
    
            public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
            {
                ExpandedMenuModel headerTitle = _listDataHeader[groupPosition];
    
                convertView = convertView ?? _context.LayoutInflater.Inflate(Resource.Layout.list_header, null);
                TextView lblListHeader = (TextView)convertView.FindViewById(Resource.Id.submenu);
                ImageView headerIcon = (ImageView)convertView.FindViewById(Resource.Id.iconimage);
                lblListHeader.Text = headerTitle.Name;
                headerIcon.SetImageResource(headerTitle.Image);
    
                return convertView;
            }
    
            public override bool IsChildSelectable(int groupPosition, int childPosition)
            {
                return true;
            }
            public class JavaObjectWrapper<T> : Java.Lang.Object
            {
                public T Obj { get; set; }
            }
    
        }
    }
    

    ExpandedMenuModel.cs(如果你想在标题上使用图标,如果不是你可以只使用字符串列表而不是模型)

    namespace NavigationDrawer_ExpandableListView
    {
        public class ExpandedMenuModel
        {
            public ExpandedMenuModel()
            {
    
            }
            public string Name { get; set; }
            public int Image { get; set; }
        }
    }
    

    Main.axml(基本上我只是在 NavigationView 中添加了 ExpandableListView)

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/drawer_layout"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:fitsSystemWindows="true">
    
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!" />
    
      </LinearLayout>
    
      <android.support.design.widget.NavigationView
          android:id="@+id/nav_view"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:layout_gravity="start"
          android:fitsSystemWindows="true">
    
        <ExpandableListView
            android:id="@+id/navigationmenu"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white"
            android:layout_marginTop="192dp">
        </ExpandableListView>
      </android.support.design.widget.NavigationView>
    </android.support.v4.widget.DrawerLayout>
    

    list_header.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="2dp"
                  android:orientation="vertical">
    
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_marginLeft="20dp"
          android:orientation="horizontal">
    
        <ImageView
            android:id="@+id/iconimage"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:paddingBottom="10dp"
            android:paddingLeft="10dp"
            android:paddingTop="10dp"/>
    
        <TextView
            android:id="@+id/submenu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:textColor="#000000"
            android:textSize="20sp"/>
    
      </LinearLayout>
    
    </LinearLayout>
    

    list_submenu.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical">
    
      <TextView
          android:id="@+id/submenu"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginLeft="20dp"
          android:padding="10dp"
          android:textColor="#000000"
          android:textSize="18sp"/>
    </LinearLayout>
    

    这是它的外观:

    您也可以从 GitHub 下载项目:https://github.com/Florin-Birgu/NavigationDrawer-ExpandableListView-Xamarin.Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多