3

リスト項目をカスタム レイアウトで表示するカスタム 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 は常に位置のオフセットと等しいため、問題はデリゲートの閉鎖によるものだと思います。

4

1 に答える 1

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

ノート:

  • Click イベント ハンドラーは 1 回だけ設定することが重要です。ビューが使用および再利用されるたびに設定するのではありません。
  • アイテム N が削除された場合 (N+1 が N になり、N+2 が N+1 になるなど) の追跡が容易だと感じたため、RemoveAt ではなく Remove を使用することにしました。ただし、RemoveAt はかなり簡単に使用できると思います (NotifyDataSetChanged を呼び出すと、表示されているすべてのリストビュー項目がリセットされると思います)。
  • Tag フィールドにこの単純な JavaContainer を使用しました - https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxJavaContainer.cs
  • 他の目的で Tag を使用する必要がある場合、Android/MonoDroid では SetTag(key,obj) を使用して複数のタグを保存できます
于 2012-11-14T08:15:29.397 に答える