如何使用xamarin android在导航抽屉中创建可扩展的列表视图

时间:2016-09-09 05:59:01

标签: c# listview xamarin.android

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

我想像下面这样创建如下图所示。

navigation drawer with expandable listview

我不熟悉java代码。 感谢。

1 个答案:

答案 0 :(得分:0)

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

在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>

以下是它的外观:

enter image description here

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