user8978978
user8978978

Reputation: 101

Handle Button click event from listview.ItemClick

I'm using xamarin, and i'm trying to handle button click event from a custom listview with button inside. How can i handle my Button from Listview.ItemClick in my main Activity?

Here is my adapter

    class MyListViewAdapterInventory : BaseAdapter<InventoryPreviewClass>
    {
        public List<InventoryPreviewClass> mitems;
        private Context mContext;
        private int mRowLayout;
        private int[] mAlternatingColors;


        public MyListViewAdapterInventory(Context context, int rowLayout, List<InventoryPreviewClass> items)
        {
            mitems = items;
            mContext = context;
            mRowLayout = rowLayout;
            mAlternatingColors = new int[] { 0xF2F2F2, 0xbfddff };

        }
        public override int Count
        {
            get
            {
                return mitems.Count;
            }
        }
        public override long GetItemId(int position)
        {
            return position;
        }
        public override InventoryPreviewClass this[int position]
        {
            get
            {
                return mitems[position];
            }

        }
        public override View GetView(int position, View convertView, ViewGroup parent)
        {



            View row = convertView;
            if (row == null)
            {
                row = LayoutInflater.From(mContext).Inflate(Resource.Layout.InventoryPreview, null, false);

            }



                row.SetBackgroundColor(GetColorFromInteger(mAlternatingColors[position % mAlternatingColors.Length]));
            TextView txtInventoryID = row.FindViewById<TextView>(Resource.Id.txtInventoryID);
                txtInventoryID.Text = mitems[position].InventoryItemID;
            TextView txtInventoryName = row.FindViewById<TextView>(Resource.Id.txtInventoryName);
                txtInventoryName.Text = mitems[position].InventoryItemName;
            TextView txtInventoryPrice = row.FindViewById<TextView>(Resource.Id.txtInventoryPrice);
                txtInventoryPrice.Text = mitems[position].InventoryItemPrice.Replace(",", ".");
            Button ExtraBtn = row.FindViewById<Button>(Resource.Id.ExtrasBtn);



            return row;

        }
        private Color GetColorFromInteger(int color)
        {
            return Color.Rgb(Color.GetRedComponent(color), Color.GetGreenComponent(color), Color.GetBlueComponent(color));
        }
    }
}

And here is my activity

   db = new SQLiteConnection(dpPath);
    var table = db.Query<InventoryPreviewClass>("select * from InventoryPreviewClass where CategoryID =" + Connection.CategoryID+ "");
    mItems = new List<InventoryPreviewClass>();
    foreach (var item in table)
    {

        mItems.Add(new InventoryPreviewClass() { InventoryItemID = item.InventoryItemID, InventoryItemName = item.InventoryItemName, InventoryItemPrice = item.InventoryItemPrice });


    }
    MyListViewAdapterInventory adapter = new MyListViewAdapterInventory(this, Resource.Layout.InventoryPreview, mItems);
    mlistview.Adapter = adapter;
    mlistview.ItemClick += Mlistview_ItemClick;

private void Mlistview_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
  // Here i need to handle my code for button click event
}

I need when user is pressing button click event to opening another activity but how can i use it inside my Mlistview.ItemClick event?? Take a look

Is it better way to handle it inside my custom adapter with Clicklistener? Any example please?

Here is what i'm doing on click event.

ExtraBtn.Click += (sender, e) =>
        {
            try
            {
                Connection.InventoryItemID = mitems[position].InventoryItemID;
                Connection.InventoryItemName = mitems[position].InventoryItemName;
                Connection.RetailPrice = mitems[position].InventoryItemPrice;
                Toast toast = Toast.MakeText(mContext, txtInventoryName.Text, ToastLength.Short);
                toast.Show();
                mContext.StartActivity(typeof(ExtrasPreviewMain));
            }
            catch (Exception ex)
            {
                Toast toast = Toast.MakeText(mContext, Convert.ToString(ex), ToastLength.Long);
                toast.Show();
            }

        };

Upvotes: 2

Views: 270

Answers (2)

diegoveloper
diegoveloper

Reputation: 103541

Set your onclick listener here :

Button ExtraBtn = row.FindViewById<Button>(Resource.Id.ExtrasBtn);
ExtraBtn.Click += (sender, e) => {
   // Perform action on click
};

Update

public override View GetView(int position, View convertView,ViewGroup parent)
        {
          DataViewHolder holder = null;
          Button ExtraBtn ;
            if (convertView == null)
            {
                convertView = LayoutInflater.From(mContext).Inflate(Resource.Layout.InventoryPreview, null, false);
                 holder = new DataViewHolder();
                 holder.txtInventoryID = convertView.FindViewById<TextView>(Resource.Id.txtInventoryID);         
                 holder.txtInventoryName = convertView.FindViewById<TextView>(Resource.Id.txtInventoryName);   
                 holder.txtInventoryPrice = convertView.FindViewById<TextView>(Resource.Id.txtInventoryPrice);
                 ExtraBtn = convertView.FindViewById<Button>(Resource.Id.ExtrasBtn);
                 ExtraBtn.Click += (sender, e) => {
                    // Perform action on click
                   }; 
                    convertView.Tag = holder;
                  ExtraBtn.Tag = position;
            } else {
                ExtraBtn = convertView.FindViewById<ImageView>(Resource.Id.lr_deleteBtn);
                 holder = convertView.Tag as DataViewHolder;
                 ExtraBtn.Tag = position;
            }
           convertView.SetBackgroundColor(GetColorFromInteger(mAlternatingColors[position % mAlternatingColors.Length]));
           holder.txtInventoryID.Text = mitems[position].InventoryItemID;
           holder.txtInventoryName.Text = mitems[position].InventoryItemName;
           holder.txtInventoryPrice.Text = mitems[position].InventoryItemPrice.Replace(",", ".");

            return convertView;

        }

     public class DataViewHolder : Java.Lang.Object
{
    public TextView txtInventoryID { get; set; }
    public TextView txtInventoryName { get; set; }
    public TextView txtInventoryPrice { get; set; }
}

Upvotes: 1

LifeStyle
LifeStyle

Reputation: 409

I think your problem is +=, use = instead.

mlistview.ItemClick += Mlistview_ItemClick;

change to:

mlistview.ItemClick = Mlistview_ItemClick;

Upvotes: 0

Related Questions