我有一个数组: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中解释。
答案 0 :(得分:2)
我有办法
在adapter
中添加刷新方法:
public void refresh(List<String> items)
{
this.items = items;
notifyDataSetChanged();
}
并从Activity
拨打电话
yourAdapter.refresh(items); // items new arrayList or Array
答案 1 :(得分:0)
ArrayAdapter
只需将传递给List<T>
的{{1}}包裹到其构造函数中,当您调用remove()
时,它会调用该列表的remove()
方法。
如果将数组而不是列表传递给构造函数,则会将其转换为Arrays.asList()
。
/**
* Constructor
*
* @param context The current context.
* @param resource The resource ID for a layout file containing a TextView to use when
* instantiating views.
* @param objects The objects to represent in the ListView.
*/
public ArrayAdapter(Context context, int resource, T[] objects) {
init(context, resource, 0, Arrays.asList(objects));
}
在较旧的Android版本中,Arrays.asList
会返回一个只读列表。这就是你得到例外的原因
您必须从数组中显式创建一个ArrayList:
adapter = new myUserAdapter( controller.getBaseContext(), R.layout.user_row, new ArrayList<User>(Arrays.asList(userArrayList)));