我正在编写一个Activity,用户必须能够通过单击“添加信息”按钮(在屏幕顶部)将项目(带有代码和描述的类)动态添加到列表视图。最初列表视图为空。我已经创建了一个自定义视图(RowItem.axml),它将在适配器GetView()调用中膨胀,以显示特定行的相关信息。问题出现在[添加信息] .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
请非常感谢任何朝着正确方向的帮助。非常感谢你。
答案 0 :(得分:2)
使用BaseAdapter而不是使用ArrayAdapter。它使您可以自由地使用像List<T>
这样的良好数据结构作为内部数据存储。
您要做的是在调用List Add(T item)
的适配器上实现Add(T item)
方法,然后调用适配器的NotifyDataSetChanged()
方法。这指示适配器的列表视图刷新自己。
结帐this example。这是一段时间以来,但代码适用于设置包含自定义视图的列表。你只需实现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[]
}