Ishwor Khanal
Ishwor Khanal

Reputation: 1370

Why listview row item gets clicked more than once?

I have implemented ListView in Xamarin.Android having couple of Buttons in rowlist but when I click button it gets hit more than once. I tried this way but did not work for me. I have this method in BaseAdapter<DA_ClassSectionAttendance>

 public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;

        // re-use an existing view, if one is available
        // otherwise create a new one
        if (view == null)
            view = context.LayoutInflater.Inflate(Resource.Layout.AttendanceCreateRowList, parent, false);
        var viewHolder = new ViewHolder(view);

        DA_ClassSectionAttendance attendance = this[position];

        view.Tag = viewHolder;
        viewHolder.ClassSection.Text = attendance.ClassName + "  " + attendance.SectionName;
        viewHolder.AttendanceEdit.Text = "Edit";
        viewHolder.AttendanceNew.Text = "New";
        viewHolder.AttendanceNew.Tag = viewHolder;
        viewHolder.AttendanceNew.Click += (object sender, EventArgs ex) =>
        {

            var obj = sender as Button;
            var listView = parent as ListView;
            //int objectPosition = (int)obj.Tag;
            var itemPosition = listView.GetPositionForView(obj);
            if (itemPosition != ListView.NoId )
            {

                CustomFragmentManager fragManager = new CustomFragmentManager();
                var fragment = new AttendanceCreateRecyclerFragment();
                Bundle args = new Bundle();
                var jsonData = JsonConvert.SerializeObject(this[itemPosition]).ToString();
                args.PutString(AttendanceCreateRecyclerFragment.DATA_RECEIVE, jsonData);
                fragment.Arguments = args;

                fragManager.ReplaceFragment(context, fragment);

            }

        };

        return view;
    }

and view holder is as follows

private class ViewHolder : Java.Lang.Object
    {
        public ViewHolder(View view)
        {
            ClassSection = view.FindViewById<TextView>(Resource.Id.class_section);
            AttendanceNew = view.FindViewById<Button>(Resource.Id.new_attendance);
            AttendanceEdit = view.FindViewById<Button>(Resource.Id.edit_attendance);
        }

        public TextView ClassSection { get; set; }
        public Button AttendanceNew { get; set; }
        public Button AttendanceEdit { get; set; }
    }

I would like to implement click event rather than click listener. If any sample code along with explanation will be much appreciated. Thank you.

Upvotes: 0

Views: 49

Answers (1)

tequila slammer
tequila slammer

Reputation: 2881

The reason is that the click event get attached multiple times with viewHolder.AttendanceNew.Click += (object sender, EventArgs ex) =>

The way you create and use the view-holder is not working. Change your code to something like that:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    View view = convertView;

    // re-use an existing view, if one is available
    // otherwise create a new one
    if (view == null)
        view = context.LayoutInflater.Inflate(Resource.Layout.AttendanceCreateRowList, parent, false);

    var viewHolder = view.Tag as ViewHolder;

    if (viewHolder == null)
    {
        viewHolder = new ViewHolder(view);
        viewHolder.AttendanceNew.Click += (object sender, EventArgs ex) =>
        {
            var obj = sender as Button;
            var listView = parent as ListView;

            var itemPosition = listView.GetPositionForView(obj);

            if (itemPosition != ListView.NoId )
            {
                CustomFragmentManager fragManager = new CustomFragmentManager();
                var fragment = new AttendanceCreateRecyclerFragment();
                Bundle args = new Bundle();
                var jsonData = JsonConvert.SerializeObject(this[itemPosition]).ToString();
            args.PutString(AttendanceCreateRecyclerFragment.DATA_RECEIVE, jsonData);
               fragment.Arguments = args;

               fragManager.ReplaceFragment(context, fragment);
           }
        };
    }

    var attendance = this[position];

    viewHolder.ClassSection.Text = attendance.ClassName + "  " + attendance.SectionName;
    viewHolder.AttendanceEdit.Text = "Edit";
    viewHolder.AttendanceNew.Text = "New";

    view.Tag = viewHolder;

    return view;
}

Upvotes: 1

Related Questions