1

我正在编写一个活动,用户必须能够通过单击“添加信息”按钮(在屏幕顶部)将项目(带有代码和描述的类)动态添加到列表视图。最初列表视图是空的。我已经制作了一个自定义视图 (RowItem.axml),它将在 Adapter GetView() 调用中膨胀以显示特定行的相关信息。问题出在 [add info].Click 事件中,我必须在列表中添加新项目:代码如下:

    void button_Click( object sender, EventArgs e )
    {
      AddNewItemToListView( listview.count);
    }
    void AddNewItemToListView(int count)
    {
       DataItem item = new DataItem();
       item.Code = FindCode(count);
       item.Description = FindDescription(count);

       listview_adapter.Add( item ); // !!  HERE AN EXCEPTION IS THROWN: --> Java.Lang.UnsupportedOperationException: 
       listAdapter.NotifyDataSetChanged();
    }

这是DataItem的定义:

public class DataItem
{
  public string Code {get;set;}
  public string Description {get;set;}
}

这是我的自定义适配器的定义:

public class MyListAdapter: ArrayAdapter<DataItem>
{
  // override code here (ex: GetView(..) ... )

一整天我都在网上搜索一些例子,但我只在 Android Java 中找到了而不是 Monodroid。在这些示例中,他们使用适配器的 .Add 方法(在大多数情况下,适配器使用简单类型,例如字符串或整数)。

我不知道我做错了什么来获得这个异常。(我唯一注意到的是 Android.Widget.ArrayAdapter (我的祖先类)的方法 Add 定义如下:

Android.Widget.ArrayAdapter<T>.Add(T @object);

“@”的用法是什么意思?我的异常与这个“@”有关吗?我试过了

 listview_adapter.Add( @item ); // STILL SAME EXCEPTION

请对正确方向的任何帮助将不胜感激。非常感谢你。

4

1 回答 1

2

不要使用 ArrayAdapter,而是使用 BaseAdapter。它使您可以自由地使用像 a 这样的良好数据结构List<T>作为内部数据存储。

您要做的是Add(T item)在调用列表的适配器上实现您的方法,Add(T item)然后调用适配器的NotifyDataSetChanged()方法。这指示适配器的列表视图刷新自身。

看看这个例子。这是前一阵子,但代码适用于设置具有自定义视图的列表。你只需要实现这样的Add(T item)东西:

public class MyAdapter : BaseAdapter<DataItem>
{
    private readonly List<DataItem> _items = new List<DataItem>();

    // Constructor if you need to set up other stuff.

    public void Add(DataItem item)
    {
        _items.Add(item);
        NotifyDataSetChanged();
    }

    // Overrides for GetItemId, GetView, Count, this[]
}
于 2013-03-23T18:22:30.760 回答