在Xamarin Android中删除ListView

4

你好,我在使用 Xamarin Android 开发时,遇到了一个关于 Listview 删除项目的问题。我的自定义行中有一个删除按钮,但是当我点击它时,会删除最后一项而不是选定的项。

下面是我的代码:

public override View GetView(int position, View convertView, ViewGroup parent)
    {
        Button btnDelete;
        var item = _items[position];
        var view = convertView;
        if (view == null)
        {
            view = _content.LayoutInflater.Inflate(Resource.Layout.CustomRow, null);
            view.FindViewById<TextView>(Resource.Id.PostTitle).Text = item.PostTitle;
            view.FindViewById<TextView>(Resource.Id.PostMessage).Text = item.PostMessage;
            view.FindViewById<TextView>(Resource.Id.PostDate).Text = item.PostDate;
            view.FindViewById<TextView>(Resource.Id.AuthorName).Text = item.AuthorName;
            view.FindViewById<ImageView>(Resource.Id.PostAvatar).SetImageResource(item.ImageResourceId);
            view.FindViewById<TextView>(Resource.Id.Date_Read).Text = item.DateRead;
            btnDelete = view.FindViewById<Button>(Resource.Id.btnDelete);
            btnDelete.Click += (sender, args) =>
            {
                var delPos = (int) (((Button) sender).GetTag(Resource.Id.btnDelete));
                _items.RemoveAt(delPos);
                NotifyDataSetChanged();
            };
        }
        else
        {
            btnDelete = view.FindViewById<Button>(Resource.Id.btnDelete);

            btnDelete.SetTag(Resource.Id.btnDelete, position);
        }

        return view;
    }

或者你能告诉我如何获取ListView中所选行的ID,我认为这是问题所在。
btnDelete.Click += (sender, args) =>
            {
                var delPos = (int) (((Button) sender).GetTag(Resource.Id.btnDelete));
                _items.RemoveAt(delPos);
                NotifyDataSetChanged();
            };
3个回答

2
只需加入这一行代码即可解决此问题。
view.FindViewById<TextView>(Resource.Id.PostTitle).Text = item.PostTitle;
        view.FindViewById<TextView>(Resource.Id.PostMessage).Text = item.PostMessage;
        view.FindViewById<TextView>(Resource.Id.PostDate).Text = item.PostDate;
        view.FindViewById<TextView>(Resource.Id.AuthorName).Text = item.AuthorName;
        view.FindViewById<ImageView>(Resource.Id.PostAvatar).SetImageResource(item.ImageResourceId);
        view.FindViewById<TextView>(Resource.Id.Date_Read).Text = item.DateRead;

在if语句之外if(view == null


1
我猜你需要将标签集移到if-else之外。从这里开始:

    else
    {
        btnDelete = view.FindViewById<Button>(Resource.Id.btnDelete);

        btnDelete.SetTag(Resource.Id.btnDelete, position);
    }

至:

    else
    {
        btnDelete = view.FindViewById<Button>(Resource.Id.btnDelete);
    }

    btnDelete.SetTag(Resource.Id.btnDelete, position);

此句话的英译中文为:“同时,尝试将标签更改为这个:”(保留HTML格式)。
// to set
btnDelete.Tag = position;

// to retrieve
var position = (int)((sender as Button).Tag);

谢谢回复,我已经这样做了,但输出结果相同,它删除的是最后一个项目而不是当前项目。 - armory09
你能否尝试一下标签的设置器/获取器,看看是否有所不同? - SKall
怎么办?我还注意到当我在自定义行上添加按钮时,无法再点击它了。 - armory09
我的意思是我不能再点击ListView了,有没有在不添加按钮的情况下删除ListView中的项目的实现方式?比如添加复选框以选择要删除的项目,然后按一个图标或其他东西来触发删除操作。 - armory09

0
首先,您需要将 else 范围内的代码移到 else 范围之外。因为在当前形式下,如果是第一次显示视图,则该视图将没有标签。
else
{
    btnDelete = view.FindViewById<Button>(Resource.Id.btnDelete);
    btnDelete.SetTag(Resource.Id.btnDelete, position);
}

至:

btnDelete = view.FindViewById<Button>(Resource.Id.btnDelete);
btnDelete.SetTag(Resource.Id.btnDelete, position);

接下来,我建议在设置和获取位置的代码处设置断点,以检查是否正确设置和获取了位置。您可以从那里找到错误。

此外,为了使您的列表也可点击,您需要将以下代码添加到包含列表项的视图组的xml中:

android:descendantFocusability="blocksDescendants"

我创建了自己的项目并进行了测试,它可以正常工作。


谢谢你的回答,我注意到当我设置断点时,它给出了正确的位置,但并没有删除正确的行。这是怎么回事?_items.RemoveAt(position); NotifyDataSetChanged(); - armory09
所以它删除了正确的行,但由于所有内容都在if(view == null)范围内,它没有正确更新listview。 - erkinyldz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接