Android 为什么listview行项目被多次单击?

Android 为什么listview行项目被多次单击?,android,listview,xamarin,xamarin.android,Android,Listview,Xamarin,Xamarin.android,我在Xamarin.Android中实现了ListView,它在行列表中有两个按钮,但当我点击按钮时,它会被多次点击。我试过这种方法,但对我无效。 我在BaseAdapter中有这个方法 视图持有者如下所示 private class ViewHolder : Java.Lang.Object { public ViewHolder(View view) { ClassSection = view.FindViewById<T

我在Xamarin.Android中实现了ListView,它在行列表中有两个按钮,但当我点击按钮时,它会被多次点击。我试过这种方法,但对我无效。 我在BaseAdapter中有这个方法

视图持有者如下所示

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

我想实现click事件,而不是click侦听器。如果有任何示例代码和解释将不胜感激。谢谢。

原因是单击事件多次与viewHolder.AttendanceNew.click+=对象发送者,EventArgs ex=>

创建和使用视图保持架的方式不起作用。将代码更改为类似以下内容:

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

RecylerView比ListView更高效。你应该使用RecylerView。我想实现click事件,而不是click侦听器-有什么区别?如果将单击侦听器设置为视图,则可以在单击视图时拦截单击事件。如果你想截获点击事件,你需要设置一个点击监听器。使用recylerView,你将获得大量的动画和平滑滚动
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;
}