gpt4 book ai didi

c# - 从 ListView 项按钮中删除 ListView 项

转载 作者:太空狗 更新时间:2023-10-29 13:33:12 25 4
gpt4 key购买 nike

我已经实现了一个自定义 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;
}

我认为问题是由于委托(delegate)闭包,因为 Items.Count 总是等于位置的偏移量。

最佳答案

我认为您对导致问题的闭包的分析可能是正确的。

为了解决这个问题,我会考虑使用 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;
}

注意事项:

  • 重要的是,Click 事件处理程序只设置一次 - 而不是每次使用和重复使用 View 时都设置。
  • 我决定使用 Remove 而不是 RemoveAt,因为我觉得在项目 N 被删除的情况下更容易跟踪(然后 N+1 变成 N,N+2 变成 N+1,等等)。但是,我认为您可以相当轻松地使用 RemoveAt(我认为 NotifyDataSetChanged 调用将重置所有显示的 ListView 项)
  • 我将这个简单的 JavaContainer 用于 Tag 字段 - https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxJavaContainer.cs
  • 如果您需要将 Tag 用于其他目的,Android/MonoDroid 允许您使用 SetTag(key,obj) 存储多个标签

关于c# - 从 ListView 项按钮中删除 ListView 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com