【发布时间】:2015-06-02 07:45:59
【问题描述】:
我有一个数组:Object[] array,以及一个扩展 ArrayAdapter<Object> 的数组适配器。
当我尝试使用adapter.remove(Object obj) 从中删除时,我得到一个UnsupportedOperationException 异常,就像this post 一样。
提供的答案建议使用 ArrayList 代替。这不是我的选择。我需要坚持使用数组。所以我将数组复制到另一个数组,但没有我要删除的项目。然后我就这样做了:
oldArray = newArray;
然后调用adapter.notifyDataSetChanged();。
这很好用,只是它不会刷新屏幕。我需要关闭然后重新打开屏幕以查看更改。 notifyDataSetChanged()不应该刷新吗?
编辑:
根据@MD 的回答,这就是我现在正在做的事情:
controller.onRemove(id);
public void onRemove(int id) {
int userListLength = usersArray.length;
int j = 0;
User[] newUserList = new User[userListLength-1];
for(int i=0; i<userListLength; i++)
{
if(id != usersArray[i].getId())
{
newUserList[j] = new User();
newUserList[j] = usersArray[i];
j++;
}
}
usersArray = newUserList;
//store in database
//...
view.getAdapter().refresh( usersArray );
}
public void refresh(User[] items)
{
this.userArray = items;
notifyDataSetChanged();
}
适配器构造:
adapter = new myUserAdapter( controller.getBaseContext(), R.layout.user_row, userArrayList);
usersListView.setAdapter( adapter );
在myUserAdapter 我有:
private User[] userArray;
解决方案:
@MD 的回答有效。但我还必须在适配器中覆盖getCount():
@Override
public int getCount () {
return userArray.length;
}
在接受的答案here中有解释。
【问题讨论】:
-
也许你需要在这里展示你的适配器
-
还请发布您如何构建
ArrayAdapter -
再次检查
adapter.remove(Object obj)。这一次你不会得到异常。userArrayList真的是ArrayList的一个实例,对吧? -
为什么不呢?除了调用新的
refresh()函数之外,我没有更改任何内容 -
如果你用 ArrayList 构造它,
add/remove将起作用。如果使用数组,它可能会使用只读列表来初始化自己。