Xamarin.android - 从ListView

时间:2017-11-02 12:51:35

标签: c# android xamarin xamarin.android

我是Xamarin的新手,我创建了一个视图,其中显示了一个项目列表,我创建了活动,axml文件和样式。它运作良好。

现在我想开始一个"意图"选择项目但我有问题获得项目的位置或标题。

我的" Console.WriteLine(selectedFromList)"只显示0值,我想从我选择的项目中获取更多信息,比如正确的位置或标题,这样我就可以验证和"意图"我对所选项目的具体活动。

namespace app_sofis.Droid
{
    [Activity(Label = "ServiziActivity" , Theme = "@style/ThemeActionBar")]
    public class ServiziActivity : Activity
    {

        public static int TYPE_ITEM = 0;
        public static int TYPE_SEPORATOR = 1;

        List<IMenuItemsType> item = new List<IMenuItemsType>();

        private ListView lst;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Servizi);

            // my items
            item.Add(new MenuHeaderItem("Servizi per il paziente"));
            item.Add(new MenuContentItem("COLLO", "Inforntuni, patologie, interventi e riabilitazione", Resource.Mipmap.ic_schiena));
            item.Add(new MenuContentItem("SPALLA", "Inforntuni, patologie, interventi e riabilitazione", Resource.Mipmap.ic_schiena));
            item.Add(new MenuContentItem("SCHIENA", "Inforntuni, patologie, interventi e riabilitazione", Resource.Mipmap.ic_schiena));


            lst = FindViewById<ListView>(Resource.Id.lstview);
            lst.Adapter = new ListViewAdapter(this, item);

            lst.ItemClick += (object sender, Android.Widget.AdapterView.ItemClickEventArgs e) =>
            {
                // HERE I WOULD LIKE VALIDATE ITEM AND START "intent" with my specific activities :)
                string selectedFromList = lst.GetItemAtPosition(e.Position).ToString();
                // trying to show item position but it return always 0
                Console.WriteLine(selectedFromList);
            };

        }

        // code for my listview

        public interface IMenuItemsType
        {
            int GetMenuItemsType();
        }

        public class MenuHeaderItem : IMenuItemsType
        {
            public string HeaderText { get; set; }

            public int GetMenuItemsType()
            {
                return TYPE_ITEM;
            }

            public MenuHeaderItem(string _headerText)
            {
                HeaderText = _headerText;
            }
        }

        public class MenuContentItem : IMenuItemsType
        {
            public string Title { get; set; }
            public string SubTitle { get; set; }
            public int IconImage { get; set; }

            public int GetMenuItemsType()
            {
                return TYPE_SEPORATOR;
            }

            public MenuContentItem(string _title, string _subtitle, int _iconImage)
            {
                Title = _title;
                SubTitle = _subtitle;
                IconImage = _iconImage;
            }
        }



        public class ListViewAdapter : ArrayAdapter<IMenuItemsType>
        {
            private Context context;
            private List<IMenuItemsType> items;
            private LayoutInflater inflater;

            public ListViewAdapter(Context context, List<IMenuItemsType> items) : base(context, 0, items)
            {
                this.context = context;
                this.items = items;
                this.inflater = (LayoutInflater)this.context.GetSystemService(Context.LayoutInflaterService);
            }


            public override int Count
            {
                get
                {
                    //throw new System.NotImplementedException();
                    return items.Count;
                }
            }

            public override long GetItemId(int position)
            {
                //throw new System.NotImplementedException();
                return position;
            }

            public override View GetView(int position, View convertView, ViewGroup parent)
            {
                //throw new System.NotImplementedException();
                View view = convertView;
                try
                {
                    IMenuItemsType item = items[position];
                    if (item.GetMenuItemsType() == TYPE_ITEM)
                    {
                        MenuHeaderItem _headerItem = (MenuHeaderItem)item;
                        view = inflater.Inflate(Resource.Layout.ListViewHeaderItem, null);
                        // user dont click header item
                        view.Clickable = false;

                        var headerName = view.FindViewById<TextView>(Resource.Id.txtHeader);
                        headerName.Text = _headerItem.HeaderText;

                    }
                    else if (item.GetMenuItemsType() == TYPE_SEPORATOR)
                    {
                        MenuContentItem _contentItem = (MenuContentItem)item;
                        view = inflater.Inflate(Resource.Layout.ListViewContentItem, null);

                        var _title = view.FindViewById<TextView>(Resource.Id.txtTitle);
                        var _imgIcon = view.FindViewById<ImageView>(Resource.Id.imgIcon);
                        var _subTitle = view.FindViewById<TextView>(Resource.Id.txtSubTitle);

                        _title.Text = _contentItem.Title;
                        _imgIcon.SetBackgroundResource(_contentItem.IconImage);
                        _subTitle.Text = _contentItem.SubTitle;
                    }
                }
                catch (Exception ex)
                {
                    Toast.MakeText(context, ex.Message, ToastLength.Long);
                }
                return view;
            }
        }
    }
}

MY CONSOLE RETURN

[ViewRootImpl@1fcd26a[ServiziActivity]] ViewPostImeInputStage processPointer 0
[ViewRootImpl@1fcd26a[ServiziActivity]] ViewPostImeInputStage processPointer 1
app_sofis.Droid.ServiziActivity+MenuContentItem

2 个答案:

答案 0 :(得分:1)

您可以使用位置从列表中获取项目:

lst.ItemClick += (object sender, Android.Widget.AdapterView.ItemClickEventArgs e) =>          
{
    MenuItemsType selectedItem = (MenuItemsType)item[e.Position];
    Console.WriteLine(selectedItem.Title);
    Console.WriteLine(selectedItem.SubTitle);
};

希望这有帮助

答案 1 :(得分:1)

我建议您在适配器类中添加以下内容:

public override IMenuItemsType this [int index]
{
    get { return items[index]; }
}

这样可以更容易地访问给定位置的项目。

lst.ItemClick += (object sender, Android.Widget.AdapterView.ItemClickEventArgs e) =>
{
    var selectedFromList = (lst.Adapter as ListViewAdapter)[e.Position];

    if(selectedFromList is MenuHeaderItem)
    {
        var intent = new Intent(this, typeof(YOUR_ACTIVITY1));

        StartActivity(intent);
    }

    if(selectedFromList is MenuContentItem)
    {
        var intent = new Intent(this, typeof(YOUR_ACTIVITY2));

        StartActivity(intent);
    }
};