Diego Cespedes
Diego Cespedes

Reputation: 1353

Xamarin.android - get information from a ListView

i'm new on Xamarin, i created a view where i'm showing a list of items, i created activity, axml files and style. It work well.

Now i would like start a "intent" on item selected but i have problem to get position or title of item.

My "Console.WriteLine(selectedFromList)" show just 0 value, i would like get more information from my item selected, like the right position or title, so i can validate and "intent" my specific activities for each item selected.

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

Upvotes: 0

Views: 1160

Answers (2)

tequila slammer
tequila slammer

Reputation: 2881

I would suggest the following addition to your adapter class:

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

That way it is easier to access an item at the given position.

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);
    }
};

Upvotes: 1

Umair M
Umair M

Reputation: 10720

You can use position to get item from the list:

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

Hope this helps

Upvotes: 1

Related Questions