【问题标题】:deleting listview in xamarin android在xamarin android中删除listview
【发布时间】:2014-10-19 11:54:56
【问题描述】:

嗨,我在 android 上删除 listview 中的项目时遇到问题,我使用的是 xamarin android,我有一个自定义行,它有删除按钮,但是当我点击它时,删除最后一个项目而不是所选项目。

这是我的代码

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

或者你能告诉我如何在列表视图中获取所选行的 ID,我认为这是问题所在。

btnDelete.Click += (sender, args) =>
            {
                var delPos = (int) (((Button) sender).GetTag(Resource.Id.btnDelete));
                _items.RemoveAt(delPos);
                NotifyDataSetChanged();
            };

【问题讨论】:

    标签: c# android android-listview xamarin xamarin.android


    【解决方案1】:

    这行代码就解决了

    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

    【讨论】:

      【解决方案2】:

      我猜你必须将标签集移到 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);
      

      另外,尝试将标签更改为:

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

      【讨论】:

      • tnx 回复,我已经这样做了,但输出相同,它删除了最后一项而不是当前项
      • 如果有效果,你可以试试 Tag setter/getter 吗?
      • 怎么样? ,我还注意到,当我在自定义行上添加按钮时,我无法再单击它了。
      • 我的意思是我不能再点击列表视图了,有没有在不添加按钮的情况下删除列表视图中的项目的实现?,比如添加复选框来选择你想要删除的项目,然后按一个图标或任何触发删除操作。
      【解决方案3】:

      首先,您需要获取 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();
      • 所以它删除了正确的行,但没有正确更新列表视图,因为一切都在 if (view == null) 范围内
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多