我已经实现了一个自定义BaseAdapter,它显示带有自定义布局的列表项。
一切正常但我试图在项目旁边添加一个删除按钮(我有),但是我在尝试让它工作时遇到了问题。
相关代码在这里:
public List<OrderLineItem> Items
{
get;
set;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
OrderLineItem item = GetItemAtPosition(position);
var view = (convertView ??
Context.LayoutInflater.Inflate(Resource.Layout.CustomListItem, parent, false)) as LinearLayout;
// ..........
var removeButton = view.FindViewById(Resource.Id.btnRemove) as Button;
removeButton.Click += delegate
{
Items.RemoveAt(position);
this.NotifyDataSetChanged();
};
// ...........
return view;
}
问题是我认为由于委托闭包,因为Items.Count总是等于位置的偏移量。
答案 0 :(得分:2)
我认为您对导致问题的闭包的分析可能是正确的。
要解决这个问题,我会考虑使用View上的Tag字段来存储当前项目 - 然后在删除操作中使用它。
public override View GetView(int position, View convertView, ViewGroup parent)
{
OrderLineItem item = GetItemAtPosition(position);
var view = convertView;
if (view == null)
{
view = Context.LayoutInflater.Inflate(Resource.Layout.CustomListItem, parent, false)) as LinearLayout;
var removeButton = view.FindViewById(Resource.Id.btnRemove) as Button;
removeButton.Click += (s, e) => {
var originalView = (View)s;
var originalItem = originalView.Tag as MvxJavaContainer<OrderLineItem>;
Items.Remove(originalItem);
this.NotifyDataSetChanged();
};
}
// ...........
var tagButton = view.FindViewById(Resource.Id.btnRemove) as Button;
tagButton.Tag = new MvxJavaContainer<OrderLineItem>(item);
return view;
}
注意: