为什么列表视图行项目被点击多次?
问题描述:
我已经在中实现了ListView,Xamarin.Android在rowlist中有几个按钮,但是当我点击按钮时,它不止一次地被点击。我试过这种方式,但没有为我工作。 我在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;
}
这种方法和观点持有者是如下
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; }
}
我想实现点击事件,而不是点击监听器。如果任何示例代码以及解释将非常感谢。谢谢。
答
的原因是,点击事件得到与viewHolder.AttendanceNew.Click += (object sender, 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。 '我想实现点击事件而不是点击侦听器 - 有什么区别?如果将点击侦听器设置为视图,则可以在单击视图时拦截点击事件。如果您想拦截点击事件,则需要设置点击侦听器。 –
使用recylerView你将获得大量的动画和平滑滚动 –